C中#if 0 和#if 1 详解
2、现在再来说说2楼提到的自动变量局部化的问题:
------------------------------------------------
通过google,得知:
#if0code#endif
(1)code中定义的是一些调试版本的代码,此时code完全被编译器忽略。如果想让code生效,只需把#if 0改成#if 1
(2)#if 0还有一个重要的用途就是用来当成注释,如果你想要注释的程序很长,这个时候#if 0是最好的,保证不会犯错误。(但是林锐的书上说千万不要把#if 0 来当作块注释使用)
#if 1可以让其间的变量成为局部变量。
(3)这个结构表示你先前写好的code,现在用不上了,又不想删除,就用这个方法,比注释方便。
------------------------------------------------
通过我上面说的第一点,我们可以知道,对“#if/#endif”的处理是预处理器完成的,而预处理器的唯一工作就是作“文字替换”的“预处理”工作,它并不负责常数符号表的生成、变量存储空间的分配、代码的重定位等工作,那么完全是给预处理器看的“#if/#endif”怎么能控制变量的生存期、怎么能决定变量可以在哪里定义??
打开编辑器,写下如下代码:
===========================volatileunsignedchara;unsignedintmain(void){a=0;#if1unsignedchar*p=&a;*p=255;#endifreturn0;}===========================
存成.c文件后用任何C编译器(不包括C++编译器)编译,都会在红字那一行报错——为什么呢?因为预处理器进行“预处理”的时候发现if的条件表达式为“真”,所以它把那段代码块留下了,而只把代码块前后的“预处理指示符号(或者叫做预处理命令)”给清除掉了,这样,预处理后的结果交给编译器“翻译”的时候,它发现在一个函数(在这里为main函数)内部的表达式语句(在这里是a = 0;)之后发现了变量声明/定义语句(在这里是声明并定义指针变量p的语句)——按照编译器的规则,这是一个错误,所以它拒绝接受这样的输入、罢工并开始抱怨(中止编译、给出错误信息)。
在这里顺便对条件编译(#ifdef,#else,#endif,#if等)进行说明。以下分3种情况: 1.情况1: #ifdef_XXXX ...程序段1... #else ...程序段2... #endif 这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。 例: #defineNUM ............. ............. ............. #ifdefNUM printf("之前NUM有过定义啦!:)\n"); #else printf("之前NUM没有过定义!:(\n"); #endif } 如果程序开头有#defineNUM这行,即NUM有定义,碰到下面#ifdefNUM的时候,当然执行第一个printf。否则第二个printf将被执行。 我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。 2:情况2: #ifndef_XXXX ...程序段1... #else ...程序段2... #endif 这里使用了#ifndef,表示的是ifnotdef。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。 3:情况3: #if常量 ...程序段1... #else ...程序段2... #endif 这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。如果有#if需要顶格写
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。