赞
踩
我们都知道vscode其实是一个编辑器,你要在上面跑C或者C++你需要配置编译器,拿编译器是怎样吧一个文本文件变成一个可执行文件的呢?
那必然是经历以下这四步
分析了以上过程由此可以很清晰的得出这个结论,条件编译是在预处理的时候发生的。
条件编译是指预处理的时候根据条件编译的指令有条件的选择源程序中的一部分代码送给编译器进行编译,进行有选择性的操作,防止宏替换的内容重复包含。
常见的条件编译指令如下:
条件编译指令 | 操作 |
#if | 如果条件为真则执行相应操作 |
#elif | 如果前面条件为假,而该条件为真,则执行相应操作 |
#else | 如果前面条件均为假,则执行相应操作 |
#endif | 结束相应的条件编译指令 |
#ifdef | 如果该宏已定义,则执行相应操作 |
#ifndef | 如果该宏没有定义,则执行相应操作 |
- #if 表达式
-
- // code
-
- #else
-
- // code
-
- #endif
如果表达式为真则#if后程序段被调用
明显发现第一段的色段跟第二段的色段都不一样!肯定是第一句输出了!
可以看到他直接call调用的就是标准命名空间下的operator类里面的函数,其实也就是 << 输出
- #ifdef 标识符
- #define 标识符 替换列表
-
- // code
-
- #endef
我们都知道NULL在C中是一个宏,宏有时也会引起不必要的问题在C++11中则有了nullptr,所以这块显示是已经被宏过了,所有不执行#define 到#endef的程序段所以看起来是灰色的。
红色框框是每个函数都有的,就是主函数栈帧开辟和销毁的过程,再看中间好家伙啥都没有,再次印证了,我们说的 如果没有定义该宏,则定义该宏,并选中从 #define 开始到 #endif 之间的程序段;如果已定义,则不再重复定义该符号,且相应程序段不被选中。
该条件编译指令更重要的一个应用是防止头文件重复包含。
如果 f.c 源文件中包含 f1.h 和 f2.h 两个头文件,而 f1.h 头文件及 f2.h 头文件中均包含 f3.h 头文件,则 f.c 源文件因为包含了 f1.h 和 f2.h 两个头文件,所以中重复包含 f3.h 头文件。可采用条件编译指令,来避免头文件的重复包含问题。
- #ifndef _HEADNAME_H_
-
- #define _HEADNAME_H_
-
- //头文件内容
-
- #endif
- #if 条件表达式1
-
- // code1
-
- #elif 条件表达式2
-
- //code 2
-
- #else
-
- //code 3
-
- #endif
- #ifdef 标识符
-
- //code
-
- #endif
- #include <iostream>
- using namespace std;
- #define PI 3.14
- int main() {
- #ifdef PI
- #undef PI
- cout << "PI 已经被取消宏" << endl;
- #endif
- }
如果检测到符号 PI 已定义,则删除其定义,并选中相应的程序段。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。