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

发布于 2021-12-04 00:55:30 字数 527 浏览 830 评论 6

#include <stdio.h>
#define XNAME(n) x ## n
#define PRINT_XN (n)  printf("x", #n "=%dn",x ##n);


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


}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

私藏温柔 2021-12-04 20:25:36

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

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

#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; }
执手闯天涯 2021-12-04 19:18:42

我说呢怎么会n会被替换掉 我自己在慢慢琢磨把 但是还是要谢谢你 哈

噩梦成真你也成魔 2021-12-04 19:03:09

@捣蛋 -E 把展开的理解一下,就知道哪错了。哈。

坚持沉默 2021-12-04 17:57:49

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

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

半世蒼涼 2021-12-04 16:27:45

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

不再见 2021-12-04 01:02:21

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文