关于昨天那个小白宏问题
昨天问了个关于宏的问题
#include<stdio.h>
#define D "a
#define F b"
int main()
{
printf(DF);
return 0;
}
这个程序有什么不对,我觉得替代之后是printf("ab");挺对啊。宏不就是简单的不做检查的替代吗?
其实问题是这样的,最近看到宏那章,上面的例子很少,只是那种#define R 3.0 #define PI 3.1415926 #define L 2*PI*R
你看那些数字还有表达式全都都没有加什么单引号双引号什么的。还有带参数的宏定义#define S(a,b) a*b也是没有引号的吧?更有后面一个程序
#include<stdio.h>
#define PR printf
#define NL "\n"
#define D "%d"
#define D1 D NL
#define D2 D D NL
#define D3 D D D NL
#define D4 D D D D NL
#define S "%s"
int main()
{
int a,b,c,d;
char string[]="CHINA";
a=1;b=2;c=3;d=4;
PR(D1,a);
PR(D2,a,b);
PR(D3,a,b,c);
PR(D4,a,b,c,d);
PR(S,string);
return 0;
}
你看第一行#define PR printf也没有什么引号,因此我就认为宏就是简单的字符串替代啊。说到这个例子我又产生了新的疑问。如果说#define D "%d"这个替代时包括引号,那么PR(D2,a,b);不就成了printf("%d" "%d" "\n",a,b);了,这样的输出格式对吗?我怎么从来没看到过?我看到的都是printf("%d%d\n",a,b);。再来看另一种假设#define D "%d"这个替代不包括引号,那么PR(D2,a,b);不就成了printf(%d %d \n,a,b);了?这两种假设替代都不对啊,怎么回事?再来说下结果,我们用VC++6.0运行结果都是1234这种,而书上截图结果却是1 2 3 4带空格的,我可是照着书上输入的啊。不信可以看下谭老的C程序设计四版辅导书185页。
写了这么长的内容,不知道遗漏了什么问题,总之看这章问题多多啊。望各位大侠指点小白。
[解决办法]
1、宏就是“替换”,的确如此。但是针对LZ的例子:
- C/C++ code
#include<stdio.h>#define D "a#define F b"int main(){ printf(DF); return 0;}