关于define FOO(_i) FOO_##_i 与define FOO(i) FOO_##i等价

#include<stdio.h>
#define FOO(_i) FOO_##_i
#define FOO_0 "1111111"
#define FOO_1 "222222"
#define FOO_2 "333333"
#define FOO_3 "444444"
#define FOO_i "1234567898989"
int main(void)
{
int i=0;
for(;i<=6;i++)
{
puts(FOO(i));
}
return 1;
}



炎炎设计
浏览 248回答 1
1回答

长风秋雁

其实我很好奇 你为什么会这么问define FOO(_i) FOO_##_i 与define FOO(i) FOO_##i这两个为什么会不等价呢?#define FOO(x) FOO_##x与define FOO(i) FOO_##i 是否等价呢?那么与#define FOO(xx) FOO_##xx是否等价呢?别想太复杂 也别被那个下划线(_)给迷惑了 无论是什么字符 只要是C语言合法的变量命名方式只要它存在于define后面的参数括号里面,那么编译的时候 就是按照这个符号进行替换展开比如(x) 那么调用的时候FOO(i) 这个i就会被替换到#define FOO(x) FOO_##x后面的所有x上 于是就是 FOO_i如果是(_i) 那么调用的时候就是替换所有的_i 于是结果还是FOO_iPS: 关于你这个代码 只能打出一系列的1234567898989为什么呢?所有宏定义的替换 都将在编译过程中展开 而不会等到执行的时候所以puts(FOO(i)); 就等同于 puts(FOO_i);而不会等到i被赋值 实时的变成puts(FOO_0)... 什么的
打开App,查看更多内容
随时随地看视频慕课网APP