转载自:http://www.cnblogs.com/kykuaileren/archive/2011/09/09/2172801.html
根据已放置在文件中的预处理指令来修改源文件的内容,预处理器会分析并执行所有的预处理指令,然后删除他们,得到一个仅包含C++语句的转换单元,预处理指令以“#”号开头
常见的预处理指令:
1、#include 包含头文件(头文件一般包含函数原型与全局变量)
形式常有下面两种
#include<iostream> | 引用标准头文件,只搜索标准库头文件的默认目录 |
#include “myheader.h” |
引用自定义的头文件,搜索正在编译的源文件所在的目录,找不到时再搜索包含标准库头文件的默认目录 |
2、#define 定义符号、宏
如:#define PI 3.1415925 // 定义符号常量PI为3.1415925,后面不加分号
在编译前,预处理器会遍历代码,在它认为置换有意义的地方,用字符串PI的定义值(3.1415925)来代替,在注释或字符串中的PI不进行替换
#undef删除#define定义的符号
如:
#define PI 3.14159265......// 之间所有的PI都可以被替换为3.14159265 #undef PI//之后不再有PI这个标识符
但是在C++中最好使用const来定义变量,如上面的定义可改为:
const long double PI=3.1415925;
两者比较下,前者没有类型的指定,容易引起不必要的麻烦,而后者定义清楚,所以在C++中推荐使用const来定义常量
#define的缺点:
1)不支持类型检查
2)不考虑作用域
3)符号名不能限制在一个命名空间中
3、#indef,#ifndef,#endif
#ifdef | 如果宏被定义就进行编译 |
#ifndef | 如果宏未被定义就进行编译 |
#endif |
结束编译块的控制 |
4、#if,#else
#if | 表达式非零就对代码进行编译 |
#else | 作为if为假的选项对代码进行编译 |
5、#error
输出一个错误信息
6、#pragma
为编译程序提供非常规的控制流信息
时间: 2024-10-19 19:21:25