C++ 预编译命令.docx
- 文档编号:4018055
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:11
- 大小:19.54KB
C++ 预编译命令.docx
《C++ 预编译命令.docx》由会员分享,可在线阅读,更多相关《C++ 预编译命令.docx(11页珍藏版)》请在冰豆网上搜索。
C++预编译命令
C++预编译命令
C++预处理指令
#include
#define
#undef
#pragma
#import
#error
#line
#ifdef
#ifndef
#if
#else
#elif
#endif
宏以#起始不以;结束
一. #include文件包含
预编译期发现#include后,将会寻找HeaderName并把其包含到当前文件中
EG:
#include
常见形式:
#include
#include
#include"iostream" //
#include"TestHeader.h" //
#include"..\TestHeader.h" //
1. #include
#include
#include
即将所有的定义放在了一个名称空间std中
2. #include
#include
多是系统的头文件
#include"iostream"首先在当前目录查找,如果没有找到再到系统目录查找
3. 头文件的多次包含问题
编译器对每个文件只编译一次生成一份机器代码.obj,如果在多个地方包含了同一个头文件,则会出现多次包含的错误,即试图让编译器将此文件编译多次生成多份机器代码。
预编译保护解决此问题。
二. #define #undef宏替换
#define宏宏主体
宏展开:
在代码中出现宏,会用宏实体代替宏
#define定义常量、函数宏
#undef 结束常量、函数宏定义
1. 常量宏
常量宏:
是最常见的一种形式。
即使用一个宏代替实际的常量,如数据、字符、字符串常量等
#defineCONST_VAL2
#defineMEG_EG"TestMacro!
"
#defineCHARACTOR_EG'M'
注:
(1) 可以使用#undef结束常量宏定义,结束宏定义宏此宏不能再次使用。
即时这个宏实际不存在,使用#undef结束宏定义也不是错误,相反在定义一个宏时如果不确定其是否已经定义可以先使用#undef结束其定义,然后重新定义
(2) 可以多次定义同一个宏
2. 函数宏
函数宏:
外形和作用都与函数类似并且有参数输入
#defineMAX(x,y)((x>y)?
x:
y)
注:
(1) 定义函数宏是将宏体都用一个“()“括起来。
#defineMAX(x,y)((x>y)?
x:
y)
cout<<"MAX="< #defineMAX(x,y)(x>y)? x: y cout<<"MAX="< 将<<和宏混淆 (2) 通常将函数宏第一为一行,但可以使用“\“定义多行宏函数 #defineMAX(x,y)((x>y)? \ x: y) (3) 可以使用#undef结束函数宏定义 #undefMAX(x,y)和#undefMAX都可以 (4) 宏函数产生内联代码,形式上等同与inline函数,当没有inline函数安全 (5) 宏函数不检查输入的参数(相比inline函数不安全) (6) 宏函数没有inline函数效率高 3. #运算符 #运算符可以在一个字符串中输入宏参数,使得一个字符串可以包含某个参数 EG: #defineSTR_A(A)(printf("STR_A(A)A="#A"")) #defineSTR_B(B)("STR_B(B)B="#B"") #defineSTR_C(CA,CB)("STR_C(CA,CB)C="#CA" "#CB"") STR_A (1); cout< cout< (2)< cout< cout< stringstrB="strB"; strB+="+"; strB+=STR_B(B); cout<<"strB+MacroSTR_B="< 4. ##运算符 ##运算符用于创建变化的变量,即使用宏参数创建变化的变量 EG: #defineVARIAVLE_NAME(N)(n##N) intVARIAVLE_NAME(IntA)=1; //intnIntA intVARIAVLE_NAME (1)=1; //intn1 intVARIAVLE_NAME (2)=1; //intn2 cout<<"nIntA="< cout<<"n"<<1<<"="< (1)< cout<<"n"<<2<<"="< (2)< doubleVARIAVLE_NAME(DoubleA)=1.1; cout<<"nDoubleA="< 三. #pragma 其格式一般为: #pragmapara 其中para为参数,下面来看一些常用的参数。 (1) #pragmaonce 多次包含的保护。 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 等价于: (此为C/C++标准通用性更强) #ifndefHEADER_NAME_HPP #defineHEADER_NAME_HPP YourCode #endif//ENDHEADER_NAME_HPP (2) #pragmawarning() #pragmawarning(warning-specifier: warning-number-list [;warning-specifier: warning-number-list...]) #pragmawarning(push[,n]) #pragmawarning(pop) EG: #pragmawarning(disable: 450734;once: 4385;error: 164) 等价于: #pragmawarning(disable: 450734)//不显示和号警告信息 #pragmawarning(once: 4385) //4385号警告信息仅报告一次 #pragmawarning(error: 164) //把号警告信息作为一个错误。 同时这个pragmawarning也支持如下格式: #pragmawarning(push[,n]) #pragmawarning(pop) 这里n代表一个警告等级(1---4)。 #pragmawarning(push)保存所有警告信息的现有的警告状态。 #pragmawarning(push,n)保存所有警告信息的现有的警告状态,并且把全局警告 等级设定为n。 #pragmawarning(pop)向栈中弹出最后一个警告信息,在入栈和出栈之间所作的 一切改动取消。 例如: #pragmawarning(push) #pragmawarning(disable: 4705) #pragmawarning(disable: 4706) #pragmawarning(disable: 4707) //....... #pragmawarning(pop) 在这段代码的最后,重新保存所有的警告信息(包括,和)。 (3) #pragmawarning() #pragmawarning(warning-specifier: warning-number-list [;warning-specifier: warning-number-list...]) #pragmawarning(push[,n]) #pragmawarning(pop) EG: #pragmawarning(disable: 450734;once: 4385;error: 164) 等价于: #pragmawarning(disable: 450734)//不显示和号警告信息 #pragmawarning(once: 4385) //4385号警告信息仅报告一次 #pragmawarning(error: 164) //把号警告信息作为一个错误。 同时这个pragmawarning也支持如下格式: #pragmawarning(push[,n]) #pragmawarning(pop) 这里n代表一个警告等级(1---4)。 #pragmawarning(push)保存所有警告信息的现有的警告状态。 #pragmawarning(push,n)保存所有警告信息的现有的警告状态,并且把全局警告 等级设定为n。 #pragmawarning(pop)向栈中弹出最后一个警告信息,在入栈和出栈之间所作的 一切改动取消。 例如: #pragmawarning(push) #pragmawarning(disable: 4705) #pragmawarning(disable: 4706) #pragmawarning(disable: 4707) //....... #pragmawarning(pop) 在这段代码的最后,重新保存所有的警告信息(包括,和)。 四. #import 常用于导入.dll 五. #error 该指令用于程序的调试,当编译中遇到#error指令就停止编译。 #if! defined(__cplusplus) #errorC++compilerrequired. #endif 如果没有在__cplusplus环境下,就会输出This software requires thecplusplus OS.然后诱发编译器终止。 所以总的来说,这条指令的目的就是在程序崩溃之前能够给出一定的信息。 六. #line 用于重置__FILE__和__LINE__ 初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C++源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析 重置后 七. #ifdef #ifndef #if #else #elif #endif条件编译 预处理器不能识别标记代码块的花括号{},对于条件编译的没有条件判断块必须使用 #endif来指定终止 1、 #ifdef identifier your code #endif 如果identifier为一个定义了的符号,your code就会被编译,否则剔除 2、 #ifndef identifier your code #endif 如果identifier为一个未定义的符号,your code就会被编译,否则剔除 3、 #if expression your code #endif 如果expression非零,your code就会被编译,否则剔除 4、 #ifdef identifier your code1 #else your code2 #endif 如果identifier为一个定义了的符号,your code1就会被编译,否则your code2 就会被编译 5、 #if expressin1 your code1 #elif expression2 your code2 #else your code3 #enif 八. 预定义宏 __DATE__ 进行预处理的日期 __FILE__ 当前软代码文件名的字符串文字 __LINE__ 当前源代码中的行号的整数常量 __TIME__ 源文件的编译时间 __TIMESTAMP__ 源文件的编译完整时间 cout<<"__DATE__="<<__DATE__< cout<<"__FILE__="<<__FILE__< cout<<"__LINE__="<<__LINE__< cout<<"__TIME__="<<__TIME__< cout<<"__TIMESTAMP__="<<__TIMESTAMP__<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 预编译命令 预编 命令