3
回答
C语言 预处理 ##运算符 错误问题
科大讯飞通用文字识别100000次/天免费使用。立即申请   
#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;


}

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

举报
捣蛋
发帖于2年前 3回/176阅
共有3个答案 最后回答: 2年前

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

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

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


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

--- 共有 1 条评论 ---
捣蛋我还是不太明白 你意思是说n会替换掉\n? 那如果要用宏定义输出进行换行要怎么办? 然后我把\n去掉后还是会报错 这个代码要怎么改你能不能帮我改改 2年前 回复

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

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

--- 共有 2 条评论 ---
中山野鬼@捣蛋 -E 把展开的理解一下,就知道哪错了。哈。 2年前 回复
捣蛋 我说呢怎么会\n会被替换掉 我自己在慢慢琢磨把 但是还是要谢谢你 哈 2年前 回复

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

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

#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; }
顶部