问一个关于 gcc -D 的宏编译问题(腾讯今年实习生春招中的问题)
- 0次
- 2021-07-13 04:37:56
- idczone
在文件bb.c中写入代码
#include
int a;
int b;
#ifdef bb
b=0;
#else
b=1;
#endif
#ifdef aa
a=0;
#else
a=1;
#endif
int main(){
printf("%d%d",a,b);
return 0;
}
然后编译gcc -Daa bb.c -o bb
问输出结果是什么:
A.11
B.10
C.1
D.00
但是测试了下结果是01....当时就懵了,没有01这个答案。。。
能不能有人能够详解下传入Daa后程序在编译时发生了什么?
gcc manpage:
-D name
Predefine name as a macro, with definition 1.
那。。问题是相当于print两个变量最后只会输出一个?
你可以 expand 一下预处理后的代码来理解
问题是, 为什么答案里没有 01 这个选项...
答案是 网页程序录入的
01 自动转 1 ?
那 00 是什么鬼...
楼上正解
经测试,输出就是01
当时我看见的备选是
A.0 B.1 C.10 D.11
然后我把选项脑补成了
A.00 B.01 C.10 D.11
最后选了B
有没有人从原理上解释下。。。
就是ifdef的应用啊,你用gcc 传了aa进去。
遇到第一个ifdef,因为没有定义bb,所以是else b=1.
第二个ifdef,因为定义了aa,所以a=0。
输出应该是01.出题目的搞错了。。。。出题目的估计想当然认为01=1.但输出格式明明是两个%d。
你还可以试试 gcc -Daa -Dbb ....
这样结果是00
不加 任何-D,结果是11
ifdef是预编译语句。就是在真正编译前先根据“环境变量”处理代码。
如果用了 gcc -Daa
真正到编译器的代码就成了
/>int a;
int b;
b=1;
a=0;
。。。。
这种写法本身有问题,有些编译器应该会报错。
应该写成
aa
int a=0;
/>int a=1;
#endif