问一个关于 gcc -D 的宏编译问题(腾讯今年实习生春招中的问题)

2015-03-31 11:37:42 +08:00
 wind3110991
在文件bb.c中写入代码
#include<stdio.h>
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后程序在编译时发生了什么?
3323 次点击
所在节点    Linux
12 条回复
xieyudi1990
2015-03-31 12:11:38 +08:00
gcc manpage:

-D name
Predefine name as a macro, with definition 1.
wind3110991
2015-03-31 12:29:23 +08:00
那。。问题是相当于print两个变量最后只会输出一个?
bcxx
2015-03-31 12:41:18 +08:00
@wind3110991 你可以 expand 一下预处理后的代码来理解
0Shaka
2015-03-31 12:52:05 +08:00
问题是, 为什么答案里没有 01 这个选项...
zongwan
2015-03-31 13:41:31 +08:00
答案是 网页程序录入的
01 自动转 1 ?
zongwan
2015-03-31 13:42:25 +08:00
@zongwan
那 00 是什么鬼...
kkhaike
2015-03-31 13:46:22 +08:00
楼上正解
maron2014
2015-03-31 14:12:11 +08:00
经测试,输出就是01
zwzmzd
2015-03-31 16:11:27 +08:00
当时我看见的备选是
A.0 B.1 C.10 D.11

然后我把选项脑补成了
A.00 B.01 C.10 D.11

最后选了B
wind3110991
2015-04-01 10:11:11 +08:00
有没有人从原理上解释下。。。
bugeye
2015-04-08 11:36:55 +08:00
就是ifdef的应用啊,你用gcc 传了aa进去。
遇到第一个ifdef,因为没有定义bb,所以是else b=1.
第二个ifdef,因为定义了aa,所以a=0。
输出应该是01.出题目的搞错了。。。。出题目的估计想当然认为01=1.但输出格式明明是两个%d。

你还可以试试 gcc -Daa -Dbb ....
这样结果是00

不加 任何-D,结果是11
bugeye
2015-04-08 11:44:16 +08:00
ifdef是预编译语句。就是在真正编译前先根据“环境变量”处理代码。
如果用了 gcc -Daa
真正到编译器的代码就成了
#include<stdio.h>
int a;
int b;

b=1;
a=0;
。。。。

这种写法本身有问题,有些编译器应该会报错。
应该写成
#ifdef aa
int a=0;
#else
int a=1;
#endif

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/180527

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX