预处理
预处理是在编译之前进行的处理,C/C++的预处理主要是宏定义、文件包含、条件编译。
指令 | 描述 |
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
#line | 用于强制指定新的行号和编译文件名,并对源程序的代码重新编号 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
宏定义
- 不带参数
#define 标识符 文本
宏名一般用大写
使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
可以用#undef命令终止宏定义的作用域
#define MAX_WIDTH 100
char str1[MAX_WIDTH];
#undef MAX_WIDTH
宏定义可以嵌套
2. 带参数
#define 宏名(参数表) 文本
例如,
#define S(a,b) ab
将area=S(3,2);进行宏替换,第一步被换为area=ab; ,第二步被换为area=3*2;
注意:有时宏替换后和我们预期的结果不一样需要注意一下,宏替换只是简单的替换。
条件编译
//当标识符已经定义时,程序段1才参加编译。
#ifdef
程序段1
#endif
//if else
#ifdef 标识符
程序段1
#else
程序段2
#endif
//if elif ... else
//指令#if, #else 和 #elif (elif = else if) 用来使得其后面所跟的程序部分只有在特定条件下才被编译。这些条件只能够是常量表达式
#if 表达式1
程序段1
#elif 表达式2
程序段2
……
#elif 表达式n
程序段n
#else
程序段n+1
#endif
#ifndef 起相反的作用:在指令#ifndef 和 #endif 之间的代码只有在某个常量没有被定义的情况下才被编译
line
用于强制指定新的行号和编译文件名,并对源程序的代码重新编号
#line编译指示字的本质是重定义 LINE和 FILE
error
#error message
//message不需要用双引号包围
//类似的,#warning用于生成编译警告。
#error命令可以简单的使编译器在发生错误时停止. 当遇到一个#error时,编译器会自动输出行号而无论message的内容. 本命令大多是用于调试,或者检测比较严重的错误
比如需要使用C++编译器,可用如下判断:
#ifndef __cplusplus
#error This file should be processed with C++ compiler.
#endif
需要使用VS编译器,可以使用如下宏判断
#ifndef _MSC_VER
#error require visual studio compiler
#endif
大部分转载于
https://www.cjavapy.com/article/1811/