错误信息
#error [message] 指示编译器报告错误,一般用于系统相关代码,例如检测操作系统类型,用条件编译里 #error 报告错误。例子如下:
int main()
{
#error "w"
return 0;
#error
}
第2个 #error 可能不被执行,因为编译器可能在遇到一个 #error "w" 时就报错停止了。
编译器预留指令
#pragma 预处理指令是C++标准给特定C++实现预留的标准,所以,在不同的编译器上 #pragma 的参数及意义可能不同,例如 VC++2010 提供 #pragma once 来指示源文件只被处理一遍。OpenMP作为一个共享内存并行编程模型,使用 #pragma omp 指导语句。
4. 预处理的典型应用
预处理的常见使用有:
Include guard,见wikipedia条目,该技术用来保证头文件仅被包含一次,以防止违反C++的"一次定义"原则;
用 #ifdef 和特殊宏识别操作系统、处理器架构、编译器,条件编译,进而实现针对特定平台的功能,多用于可移植性代码;
定义函数宏,以简化代码,或是方便修改某些配置;
用 #pragma 设定和实现相关的配置(见上一节最后给出的链接)。
sourceforge.net上有一个项目,是关于用宏检测操作系统、处理器架构、编译器(请点链接或见参考文献)。下面是一个例子(来自这里):
#ifdef _WIN64
//define something for Windows (64-bit)
#elif _WIN32
//define something for Windows (32-bit)
#elif __APPLE__
#include "TargetConditionals.h"
#if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR
// define something for simulator
#elif TARGET_OS_IPHONE
// define something for iphone
#else
#define TARGET_OS_OSX 1
// define something for OSX
#endif
#elif __linux
// linux
#elif __unix // all unices not caught above
// Unix
#elif __posix
// POSIX
#endif