C语言 预处理 ##运算符 错误问题

捣蛋 发布于 2016/06/19 20:35
阅读 210
收藏 0
#include <stdio.h>
#define XNAME(n) x ## n
#define PRINT_XN (n)  printf("x", #n "=%d\n",x ##n);


int main(void)
{
int XNAME(1) = 14;//NXAME改为14
int XNAME(2) = 20; //NXAME改为20
PRINT_XN(1);//PRINT_XN改为printf(x1 "=%d\n",x1)
PRINT_XN(2);//PRINT_XN改为printf(x2 "=%d\n",x2)
return 0;


}

这个代码是照着书籍里面的代码打的为什么会出现这样的错误 求大牛们指教一下

加载中
0
中山野鬼
中山野鬼

哈, 顺带搜了下我自己的代码库,贴两段,

另一段是使用上述定义的地方:

不知道是否对你有帮助。。。哈。


额外你的 PRINT的定义就有错误。建议搞c的新手,自己写个宏替换操作的代码出来。其实不难,而且更容易理解宏。

捣蛋
捣蛋
我还是不太明白 你意思是说n会替换掉\n? 那如果要用宏定义输出进行换行要怎么办? 然后我把\n去掉后还是会报错 这个代码要怎么改你能不能帮我改改
0
中山野鬼
中山野鬼

我可不会帮你改。改了也白改。最多在帮你展开一下测试。另外我要更正下我上面的一个描述错误。在"" 内的n 是不会被替换的。哈。

你使用 gcc -E 的选项,展开试试就知道了。无非额外提醒你,你的 ( 貌似错了。哈哈。

中山野鬼
中山野鬼
@捣蛋 -E 把展开的理解一下,就知道哪错了。哈。
捣蛋
捣蛋
我说呢怎么会\n会被替换掉 我自己在慢慢琢磨把 但是还是要谢谢你 哈
0
乌龟壳
乌龟壳

我说下宏的原理,看看能不能加深理解。

 所谓宏,不管语法有多少细节,它做的就是操作源代码的文本。

#include <stdio.h>
#define START {
#define END return 0; }
#define ABC int main()
#define OUT(s) printf(s

ABC START OUT("hello world")); END

输出就是hello world

gcc -E xxx.c就能看到宏替换后的效果

int main() { printf("hello world"); return 0; }
返回顶部
顶部