Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
wind3110991
V2EX  ›  Linux

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

  •  
  •   wind3110991 · Mar 31, 2015 · 4247 views
    This topic created in 4239 days ago, the information mentioned may be changed or developed.
    在文件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 replies  •  2015-04-08 11:44:16 +08:00
    xieyudi1990
    xieyudi1990
    Mar 31, 2015❤️2
    1
    gcc manpage:

    -D name
    Predefine name as a macro, with definition 1.
    wind3110991
    wind3110991
    OP
    Mar 31, 2015
    2
    那。。问题是相当于print两个变量最后只会输出一个?
    bcxx
    bcxx
    Mar 31, 2015
    3
    @wind3110991 你可以 expand 一下预处理后的代码来理解
    0Shaka
    0Shaka
    Mar 31, 2015
    4
    问题是, 为什么答案里没有 01 这个选项...
    zongwan
    zongwan
    Mar 31, 2015❤️1
    5
    答案是 网页程序录入的
    01 自动转 1 ?
    zongwan
    zongwan
    Mar 31, 2015
    6
    @zongwan
    那 00 是什么鬼...
    kkhaike
    kkhaike
    Mar 31, 2015
    7
    楼上正解
    maron2014
    maron2014
    Mar 31, 2015
    8
    经测试,输出就是01
    zwzmzd
    zwzmzd
    Mar 31, 2015
    9
    当时我看见的备选是
    A.0 B.1 C.10 D.11

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

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

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

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

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

    这种写法本身有问题,有些编译器应该会报错。
    应该写成
    #ifdef aa
    int a=0;
    #else
    int a=1;
    #endif
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   770 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 23:07 · PVG 07:07 · LAX 15:07 · JFK 18:07
    ♥ Do have faith in what you're doing.