技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> C语言宏替换的一个小问题

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

浏览:1956次  出处信息

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”);这样也不行。

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

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1