IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

C语言宏替换的一个小问题

kernelchina blogs 2011-09-19 13:35:05 累计浏览 2,545 次
本机暂存

gcc和vc2008都支持宏字符串链接,下面是一个小例子:

#define PRINT_STR(string) printf(#string);

int main(){
    PRINT_STR("appleleaf \n");
    return 0;
}

出乎意料的是,打印的结果是:

"appleleaf \n",没有换行,还多了两个括号

使用-E展开宏可以看出来宏被翻译为

printf("\"appleleaf \\\\n\"");;

只有这么写才能正确输出:

PRINT_STR(appleleaf \n);

也就是去掉字符串前后的括号。

对于这样的预处理是实现,我设计了一个小case, 想要打印appleleaf回车后再打印abcd:

PRINT_STR(appleleaf \n, abcd);这样显然不行,是两个参数,且第二个参数code引用有问题,linux下面引用不到。

PRINT_STR(“appleleaf \n, abcd”);这样也不行。

预处理器的设计者最初为何设计这种违背直观的替换方案,我还是觉得奇怪。

同分类推荐文章

  1. 科技爱好者周刊(第 401 期):如何赚到10亿美元 (2026-06-26 08:05:38)
  2. 如何做决策 - 从 Go 的一个 issue 说起 (2026-06-26 08:00:00)
  3. Seven Player:Windows上播放115网盘视频的增强工具 (2026-06-09 00:06:47)

查看更多 开发者 文章 →

建议继续学习

  1. 每个程序员都应该学习使用Python或Ruby (累计阅读 17,923)
  2. 如何学好C++语言 (累计阅读 10,456)
  3. 最常被程序员们谎称读过的计算机书籍 (累计阅读 9,159)
  4. 从C语言的Hello World说起 (累计阅读 7,646)
  5. 敲击最多的键和编程语言语法 (累计阅读 7,468)
  6. 技术人员如何去面试? (累计阅读 6,700)
  7. 为什么数组标号是从0开始的? (累计阅读 6,314)
  8. 千万别惹程序员 (累计阅读 5,779)
  9. 为什么C语言需要函数声明 (累计阅读 5,722)
  10. 注释里的诅咒:哪种语言遭受最多的咒骂? (累计阅读 5,642)