1 #include
2
3 //#define TRUE_
4
5 int main(void)
6 {
7 #ifdef TRUE_
8 printf("hello word!\n");
9 #endif
10
11 }
当我注释起来第三行时,程序运行结果:
ldy@linux:~/C/aboutdefine$ gcc 1.c -o 1
ldy@linux:~/C/aboutdefine$ ./1
ldy@linux:~/C/aboutdefine$
什么结果都没有,因为我们没有定义这个宏,然后我们把第三行注释去掉看看:
ldy@linux:~/C/aboutdefine$ gcc 1.c -o 1
ldy@linux:~/C/aboutdefine$ ./1
hello word!
ldy@linux:~/C/aboutdefine$
嗯这个就是#ifdef的作用了很容易理解。
然后肯定有人会问这个 #ifdef能干什么,我仅仅是了解一点作用,还不是很深入,就稍微说一点吧。
看下面这两段代码:
第一段在2.h里面:
1 #ifndef TRUE_
2 #define TRUE_
3 #endif
第二段在2.c里面:
1 #include
2 //#include "2.h"
3
4 int main(void)
5 {
6 #ifdef TRUE_
7 printf("hello world!\n");
8 #endif
9 return 0;
10 }
同样的我先把#include "2.h"注释掉运行:
ldy@linux:~/C/aboutdefine$ gcc 2.c -o 2
ldy@linux:~/C/aboutdefine$ ./2
ldy@linux:~/C/aboutdefine$
什么都没有。
然后我把注释删除掉看看:
ldy@linux:~/C/aboutdefine$ gcc 2.c -o 2
ldy@linux:~/C/aboutdefine$ ./2
hello world!
ldy@linux:~/C/aboutdefine$
运行出结果。我做这两个程序的目的是让大家看到 #ifdef的一个作用。那就是可以区分头文件,当包括某个头文件时我执行某些代码,不包括时不执行。用这个就可以区分头文件了。
4.#ifndef:
这个ifndef = if not define 和上面的#ifdef用法一样只是颠倒过来。
5.#if:
#if实际上和C/C++中的if是一样的,用来判定宏定义是否为0,为0则不执行#if后面的代码,非零则执行。
看下面这段代码:
1 #include
2
3 #define TRUE_ 1
4
5 int main(void)
6 {
7 int a = 1;
8 #if TRUE_
9 //#if a
10 printf("#if\n");
11 #endif
12 if(TRUE_){
13 // if(a){
14 printf("if\n");
15 }
16 }
我想同时测试一下#if和if对宏定义和普通变量定义的使用规则:
我注释掉了8和13行,先对宏定义进行测试:
运行结果:
ldy@linux:~/C/aboutdefine/if$ gcc 1.c -o 1
ldy@linux:~/C/aboutdefine/if$ ./1
#if
if
我将#define TRUE_ 改成0运行:
ldy@linux:~/C/aboutdefine/if$ gcc 1.c -o 1
ldy@linux:~/C/aboutdefine/if$ ./1
ldy@linux:~/C/aboutdefine/if$
什么都没有,这个就是#if的用法。
然后去掉注释将程序改成下面的状态:
1 #include
2
3 #define TRUE_ 0
4
5 int main(void)
6 {
7 int a = 1;
8 //#if TRUE_
9 #if a
10 printf("#if\n");
11 #endif
12 // if(TRUE_){
13 if(a){
14 printf("if\n");
15 }
16 }
注释掉8 12,看看他们对普通变量的结果:
ldy@linux:~/C/aboutdefine/if$ gcc 1.c -o 1
ldy@linux:~/C/aboutdefine/if$ ./1
if
ldy@linux:~/C/aboutdefine/if$
只有if响应了普通变量,而#if并没有响应,我猜想是#if值认识宏定义的东西而不认识别人的,所以它默认后面为假。(如果我说的不对希望纠正)
说说用#if的好处,看上去#if和if好像大同小异,但是实际上如果程序中使用#if的话假如判断此段为假的话,这段代码会被编译程序删除,然后执行下面的。而if却不会删除代码,而且每次执行都会去判断一遍。
#else:
这个#else和else的关系和#if和if的关系是一样的。
#elif:
#elif 和 if else 的关系和#if 和 if的关系是一样的。
#undef:
删除一个宏定义,很好理解就不做演示了。