七.条件编译
可以实现将一条语句(一组语句)编译或者放弃。
常见的条件编译指令:
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"有什么区别?
文件的查找策略不同。
🐲👻关于预处理的知识就到此结束了,若有错误或是建议,欢迎小伙伴们提出;😼🦖
😍🥰希望小伙伴们能多多支持博主哦,你们的支持对我很重要;🤩😆
😄😃谢谢你的阅读。😁🥰