juliusun.com
第 43/50 节 冥河C语言教程
本节将介绍ifdef及其相关指令,列表如下:ifdef、ifndef、else、endif,这几个预处理指令(加上if指令,if指令以后介绍)也被称为条件编译指令。
ifdef用法如下:
#ifdef 宏名 程序段1 #else 程序段2 #endif
程序段2为空时,#else可以省略,即写成如下形式:
#ifdef 宏名 程序段1 #endif
当ifdef后面的宏名为有效状态,编译器则编译"程序段1",否则编译"程序段2"(如果存在"程序段2")。
在代码前定义过宏名,且没有使用undef使其失效,则宏名为有效状态。否则为无效状态。
ifndef用法与其相反:
#ifndef 宏名 程序段A #else 程序段B #endif
程序段2为空时,#else可以省略,即写成如下形式:
#ifndef 宏名 程序段A #endif
当ifndef后面的宏名为无效状态,编译器则编译"程序段A",否则编译"程序段B"(如果存在"程序段B")。
为防止混淆,ifdef程序段以数字命名,ifndef程序段以大写字母命名。
注意,预处理指令ifdef和ifndef是在编译之前执行。所以当某程序段不编译时,编译器直接当作没有书写那部分代码,直接不会编译代码段。而if-else语句是无论如何都会编译代码段,但是在执行的时候不去执行。
理解一下:条件不成立时,预处理指令不会编译代码,而if-else语句是编译代码,执行时不去执行。
要记住,预处理先于编译执行。
注意,预处理指令是以endif指令作为结尾,不像if-else等语句以花括号当作结尾。endif指令一定不要忘记。
举例说明,在书写代码时,我们经常需要输出调试信息,但是开发完成后,程序交给用户用的时候又不能输出调试信息。如果开发完程序删除输出调试信息代码,麻烦,且有遗忘之处,会影响用户体验。即使全部清除调试信息相关内容,升级更新时,仍然需要再附加上调试信息,麻烦,且易出错,使用ifdef指令可以解决这个问题,例:
需要书写很多调试代码时,上述使用ifdef或ifndef来选择性编译代码,大大简化了发行程序时的工作量。
上述效果类似:
删除DEBUG宏定义时效果图类似: