Chinaunix首页 | 论坛 | 博客
  • 博客访问: 368587
  • 博文数量: 36
  • 博客积分: 955
  • 博客等级: 准尉
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-15 13:37
文章分类

全部博文(36)

文章存档

2012年(15)

2011年(21)

分类: C/C++

2011-11-30 21:20:49

昨天开始看XEN信息页,发现里面有大量的宏使用,看着总是不习惯,于是将这些东西总结出来,共同学习。

1.#define:
这个大家应该再熟悉不过了,宏定义,我就不细讲了,相信大家都已经使用的非常习惯了。

2.#endif:
这个我也不进行细说了,只要是以#if开头的,都要在使用后用这个结束。

3.#ifdef:
先说说这个等于什么ifdef = if define意思是如果定义了这个宏该怎么样下面有两段代码:
  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:
删除一个宏定义,很好理解就不做演示了。
阅读(1733) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

KakitChen2011-12-06 16:31:52

一会要用,来学习学习。