C/C++的预编译指令

1.预处理过程通过扫描程序源代码,会检查代码里包含的预处理指令,完成诸如包含其他源文件、定义宏等,对其进行初步的转换,产生新的源代码提供给编译器。

2.预编译指令用#开头。

3.常用指令:

(1)#include

#include <xxx.h>预处理程序会在系统默认目录或者括号内的路径查找,通常用于包含系统中自带的公共头文件
#include "xxx.h"  预处理程序会在程序源文件所在目录查找,如果未找到则去系统默认目录查找,通常用于包含程序作者编写的头文件。

(2)#define、#undef指令
#define指令定义了一个标识符及一个串,标识符称为宏名,源程序中宏名的每次出现都会用其定义的串进行替换,称为宏替换。

带参数的#define指令(宏函数)带参数的宏和函数调用看起来有些相似,如 #define MIN(x,y) (((x) > (y)) ? (x) : (y)) 

#undef指令取消一个已定义的宏。

宏定义中的#运算符把跟在其后的参数转换成一个字符串。

宏定义中的##运算符把出现在##两侧的参数合并成一个符号。

 (3)条件编译指令#if、#elif、#else、#endif

  1. #if 

  2. #elif 

  3. #else  

  4. #endif              
(4) 条件编译指令 #ifdef、#ifndef、#endif指令

检查后面指定的宏是否已经定义,然后根据检查结果选择是否要编译后面语句。其中#ifdef表示”如果有定义“,#ifndef表示”如果没有定义“,这个通常可以用于防止重复包含头文件的问题。

(5)特殊符号指令

预编译程序可以识别一些特殊的符号。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。

 
 
__FILE__ 包含当前程序文件名的字符串(双下划线
__LINE__  表示当前行号的整数
__DATE__ 包含当前日期的字符串
__STDC__  如果编译器遵循ANSI C标准,它就是个非零值
__TIME__ 包含当前时间的字符串
 
 
 
 

#error指令将使编译器显示一条错误信息,然后停止编译。
#line指令改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。
#pragma指令没有正式的定义,编译器可以自定义其用途。

1. #pragma once
在头文件的最开始加入这条指令可以保证头文件只被编译一次。它可以实现上述使用#ifndef实现不重复包含头文件同样的功能,但可能会有部分编译系统不支持。
2. #pragma message
该指令能够让编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。其使用方法为:#pragma message(“消息文本”)
通过这条指令我们可以方便地记录在是否在源代码中定义过某个宏

 #pragma warning
该指令能够控制编译器发出警告的方式,其用法举例如:#pragma warning(disable : 4507 34; once : 4385; error : 164)
这个指令有三部分组成,其中disable部分表示忽略编号为4507和34的警告信息,once部分表示编号为4385的警告信息只显示一次,error部分表示把编号为164的警告信息当做错误。
另外,其还有两个用法
#pragma warning(push [, n]):保存所有警告信息的现有的警告状态,后面n是可选的,表示把全局警告等级设为n。
#pragma warning(pop):弹出最后一个警告信息,取消在入栈和出栈之间所作的一切改动。

 

猜你喜欢

转载自blog.csdn.net/lcking18325/article/details/60360458