惧留孙网

juliusun.com

在线教程 > C语言教程 > 预处理指令之ifdef

预处理指令之ifdef

第 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指令可以解决这个问题,例:


  1. #include<stdio.h>
  2. #define DEBUG //发行给用户时,此行删除或加上注释即可,不用做其它改动。调试时加上此行,不用其它操作
  3. //宏定义时可以不给出宏值,值为空,代码用引用DEBUG宏时,用空代码代替
  4. int main( )
  5. {
  6. for (int i = 1; i < 10;++i)
  7. {
  8. #ifdef DEBUG //判断宏名是否有效
  9. printf("调试信息:i=%d 时输出行为 ",i);
  10. #endif //结束ifdef指令
  11. /*也可写成如下形势
  12. #ifndef DEBUG //如果没有定义,没有程序段需要编译
  13. #else //宏名有效编译如下代码
  14. printf("调试信息:i=%d 时输出行为 ",i);
  15. #endif//结束ifndef指令
  16. */
  17. for (int j = 1; j < i;++j)
  18. {
  19. printf("*");
  20. }
  21. printf("\n");
  22. }
  23. getchar( ) ; //使程序暂停一下
  24. return 0;
  25. }

需要书写很多调试代码时,上述使用ifdef或ifndef来选择性编译代码,大大简化了发行程序时的工作量。

上述效果类似:

Pic

删除DEBUG宏定义时效果图类似:

Pic

作者:冥河 QQ:3304576112
交流QQ群:554701039 C语言讲课群
本教程内容由本站保留版权,请勿复制传播
抖音
©2015-2024 惧留孙网 juliusun.com

京ICP备15039193号-1

首页 教程 下载 文章 聊天 我的