C进阶:预处理(下)

简介: C进阶:预处理(下)

七.条件编译

可以实现将一条语句(一组语句)编译或者放弃。

常见的条件编译指令:

1.

#if 常量表达式

//...

#endif

//常量表达式由预处理器求值。

如:

#define __DEBUG__ 1

#if __DEBUG__

//..

#endif

例:

1. int main()
2. {
3. #if 1    //如果这个常量表达式为真,则执行后面的语句,反之则不执行
4.  printf("haha\n");
5. #endif
6.  return 0;
7. }

运行结果:

2.多个分支的条件编译

#if 常量表达式

//...

#elif 常量表达式 (注意这里是 elif ,而不是else if )

//...

#else

//...

#endif

例:

1. #define M 10
2. 
3. int main()
4. {
5. #if M==5
6.  printf("mafumafu\n");
7. #elif M==10
8.  printf("Eve\n");
9. #elif M==7
10.   printf("Sou\n");
11. #elif M==2
12.   printf("amatsuki\n");
13. #else 
14.   printf("soraru");
15. #endif
16.   return 0;
17. }

运行结果:

3.嵌套指令

       #if defined(OS_UNIX)    //如果定义了,则往下执行

               #ifdef OPTION1

                       unix_version_option1();

               #endif

               #ifdef OPTION2

                       unix_version_option2();

               #endif

               #elif defined(OS_MSDOS)

               #ifdef OPTION2

                       msdos_version_option2();

               #endif

       #endif

八.头文件包含的方式

1.  双引号式 #include "test.h" :先在源文件所在目录下查找,如果该头文件未找到,编译器                                                     就像查找库函数头文件一样在标准位置查找头文件。

                                                如果找不到就提示编译错误。

2.尖括号式 #include <stdio.h>: 查找头文件直接去标准路径下去查找,如果找不到就提示编                                                     译错误。

所以说库里的头文件也可以用 双引号 包含 ,但并不建议这样做,因为双引号包含没有尖括号包含的查找的快。

嵌套文件包含

comm.h和comm.c是公共模块。

test1.h和test1.c使用了公共模块。

test2.h和test2.c使用了公共模块。

test.h和test.c使用了test1模块和test2模块。

这样最终程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复。

如何防止这种问题出现?

有两种解决方式:

1.利用条件编译指令

1. #ifndef __TEST_H__   //如果没有定义  TEST_H__  则执行下一句代码  定义 __TEST_H__
2. #define __TEST_H__
3. #endif

2.利用预处理指令  #pragma   once

《高质量C/C++编程指南》中的两个问题

1. 头文件中的 ifndef/define/endif是干什么用的?

  防止头文件的重复引用。

2. #include <filename.h> 和 #include "filename.h"有什么区别?

  文件的查找策略不同。


🐲👻关于预处理的知识就到此结束了,若有错误或是建议,欢迎小伙伴们提出;😼🦖

😍🥰希望小伙伴们能多多支持博主哦,你们的支持对我很重要;🤩😆

😄😃谢谢你的阅读。😁🥰


目录
相关文章
|
5天前
|
编译器 C++
C++语言预处理器学习应用案例
【4月更文挑战第8天】C++预处理器包括条件编译、宏定义和文件包含等功能。例如,条件编译用于根据平台选择不同代码实现,宏定义可简化常量和变量名,文件包含则用于整合多个源文件。示例中展示了如何使用`#ifdef`等指令进行条件编译,当`DEBUG`宏定义时,`PRINT_LOG`会打印调试信息,否则不执行。
17 1
|
5天前
|
C语言
【C语言进阶篇】你真的了解预处理吗? 预处理详细解析
【C语言进阶篇】你真的了解预处理吗? 预处理详细解析
38 0
|
9月前
预处理的学习
预处理的学习
35 0
|
10月前
|
自然语言处理 编译器
C进阶:预处理(上)
C进阶:预处理
46 0
|
12月前
|
编译器 Linux C++
【C进阶】——预处理详解(二)
【C进阶】——预处理详解(二)
102 0
|
12月前
|
Linux C语言 C++
【C进阶】——预处理详解(一)
【C进阶】——预处理详解(一)
47 0
|
11月前
|
编译器 C语言 C++
C语言编程—预处理器
预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CPP。
65 0
|
12月前
|
编译器 C语言 C++
万字【C语言程序的预处理】各种知识点的讲解2
万字【C语言程序的预处理】各种知识点的讲解
|
编译器 C++
c++入门篇之C++ 预处理器
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。
|
编译器
【学习笔记之我要C】预处理
【学习笔记之我要C】预处理
60 0