V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wind3110991
V2EX  ›  Linux

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

  •  
  •   wind3110991 · 2015-03-31 11:37:42 +08:00 · 3201 次点击
    这是一个创建于 3313 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在文件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后程序在编译时发生了什么?
    12 条回复    2015-04-08 11:44:16 +08:00
    xieyudi1990
        1
    xieyudi1990  
       2015-03-31 12:11:38 +08:00   ❤️ 2
    gcc manpage:

    -D name
    Predefine name as a macro, with definition 1.
    wind3110991
        2
    wind3110991  
    OP
       2015-03-31 12:29:23 +08:00
    那。。问题是相当于print两个变量最后只会输出一个?
    bcxx
        3
    bcxx  
       2015-03-31 12:41:18 +08:00
    @wind3110991 你可以 expand 一下预处理后的代码来理解
    0Shaka
        4
    0Shaka  
       2015-03-31 12:52:05 +08:00
    问题是, 为什么答案里没有 01 这个选项...
    zongwan
        5
    zongwan  
       2015-03-31 13:41:31 +08:00   ❤️ 1
    答案是 网页程序录入的
    01 自动转 1 ?
    zongwan
        6
    zongwan  
       2015-03-31 13:42:25 +08:00
    @zongwan
    那 00 是什么鬼...
    kkhaike
        7
    kkhaike  
       2015-03-31 13:46:22 +08:00
    楼上正解
    maron2014
        8
    maron2014  
       2015-03-31 14:12:11 +08:00
    经测试,输出就是01
    zwzmzd
        9
    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
        10
    wind3110991  
    OP
       2015-04-01 10:11:11 +08:00
    有没有人从原理上解释下。。。
    bugeye
        11
    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
        12
    bugeye  
       2015-04-08 11:44:16 +08:00   ❤️ 1
    ifdef是预编译语句。就是在真正编译前先根据“环境变量”处理代码。
    如果用了 gcc -Daa
    真正到编译器的代码就成了
    #include<stdio.h>
    int a;
    int b;

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

    这种写法本身有问题,有些编译器应该会报错。
    应该写成
    #ifdef aa
    int a=0;
    #else
    int a=1;
    #endif
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3285 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:15 · PVG 22:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.