#define和gcc +Dxx有什么区别

前言

遇到一个之前都没仔细研究过的一个问题,使用GCC +Dxx的形式定义了一个宏,但是在c文件中,漏写了,本来应该写成#ifdef xx的,但是缺了def,写成了 #if xx

没想到居然编译通过,并且还执行了。

测试

1、测试使用#define能否正确编译

     1  #include <stdio.h>
     2
     3  #define TEST
     4
     5  void test1()
     6  {
     7          printf("hello\n");
     8
     9  }
    10
    11  void test()
    12  {
    13  #if TEST
    14          test1();
    15  #endif
    16  }
    17
    18
    19  void main()
    20  {
    21          test();
    22          return;
    23  }

编译:gcc a.c
结果:a.c:13:9: error: #if with no expression
结论:说明c文件中使用宏定义,在预处理阶段仅仅只是替换,因此这里的报错是无#if语句;

2、测试GCC +Dxx方式编译

因此怀疑可能是编译环境问题导致,所以尝试一下GCC +Dxx进行编译;

     1  #include <stdio.h>
     2
     3
     4  void test1()
     5  {
     6          printf("hello\n");
     7
     8  }
     9
    10  void test()
    11  {
    12  #if (TEST==0)
    13          printf("TEST is %d\n", TEST);
    14          test1();
    15  #endif
    16  }
    17
    18
    19  void main()
    20  {
    21          test();
    22          return;
    23  }

编译成功: gcc -DTEST a.c
执行: ./a.out

TEST is 1
hello

结论:通过gcc +D的形式编译,默认会定义宏为1;也就是说前言里的现象是正确的,相当于#if 1的情况;

3、测试+D的值是不是就是1

     1  #include <stdio.h>
     2
     3
     4  void test1()
     5  {
     6          printf("hello\n");
     7
     8  }
     9
    10  void test()
    11  {
    12  #if (TEST==0)
    13          printf("TEST is %d\n", TEST);
    14          test1();
    15  #endif
    16  }
    17
    18
    19  void main()
    20  {
    21          test();
    22          return;
    23  }

编译: gcc -DTEST a.c -o b.out
执行结果: 无
结论: 说明#if (TEST==0)这个语句不成立,说明+D的形式就是定义了为1。

结论

gcc +Dxx的形式,将变量定义了1;
#define xx 的形式,会在预处理时被替换,可能造成语法错误;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值