#define已经在前面介绍过了,这里就不再讨论。#error可以强迫编译程序停止编译,用来在编译期检查环境是否符合要求或者与约束的条件发生了冲突。其使用格式是:
#error token-string
当程序在编译过程当中遇到这个关键字,就会停止编译,产生一个错误信息,并且输出后面的token-string。例如:
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
上面这段代码的意思是在预编译期检查当前的程序是否是C++编程环境,如果不是,就定义#error,让编译器停止编译。#if和#endif会在后面介绍,这里只需要将#if视为普通的if判断语句,将#endif看成是if判断的结束。
#include使编译程序将#include所指向的源文件导入进当前的源文件,被包含的文件必须被尖括号或者引号包围起来。#if,#else,#elif,#endif,#ifdef和#ifndef属于条件编译命令,可以对程序的各个部分有选择地进行编译。#undef命令用来取消前面定义过的宏名。例如:
#define NUMBER 10
int _tmain(int argc, _TCHAR* argv[])
{
#ifdef NUMBER
cout << NUMBER << endl; // 输出10
#endif
#undef NUMBER
#ifdef NUMBER
cout << NUMBER << endl;
#else
cout << "找不到NUMBER定义" << endl; // 输出“找不到NUMBER定义”
#endif
return 0;
}
在程序的第1行定义了NUMBER宏,在第6行输出10。在第8行取消NUBMER宏的定义,所以后面会输出“找不到NUMBER定义”。
11.5.2利用预定义的宏指令进行有条件编译
预定义宏#if,#else,#elif,#endif,#ifdef和#ifndef都是条件编译命令。所谓条件编译,就是可以将源文件中的代码分成几个部分,有选择地编译各个部分。对于前三个宏#if,#else和#elif,可以理解为if,else和else if,#endif表示这个条件编译选择的结束。看下面的程序:
#define NUMBER 5
int main(int argc, _TCHAR* argv[])
{
#if NUMBER == 10
cout << "Number is equal to 10." << endl;
#elif NUMBER == 5
cout << "Number is equal to 5." << endl;
#else
cout << "Others." << endl;
#endif
return 0;
}
程序的第1行定义NUMBER宏,令其等于5。后面的代码判断是否等于相应的值,选择性地编译后面的语句,由于定义NUMBER等于5,编译器输出“Number is equal to 5”。
另一种条件编译的方式就是使用#ifdef和#ifndef。同样,这两个命令也用#endif作为作用域的结束。#ifdef判断后面的标识符是否被定义,通常都是指预定义的宏,#ifndef就是#ifdef的取反。看下面的程序:
#define DEBUG
int main(int argc, _TCHAR* argv[])
{
#ifdef DEBUG
cout << "Debug version." << endl;
#endif
return 0;
}
第4行判断是否定义DEBUG标识符(在第1行定义),然后编译后面的语句。