前言
遇到一个之前都没仔细研究过的一个问题,使用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 的形式,会在预处理时被替换,可能造成语法错误;