VC预处理命令 第2页
#undef指令可使一个标识符的预处理器定义失效。有关的更多信息参见#undef指令。若一个被定义的宏名称出现在语言符号字符串中(即使是另一个宏扩展的结果),它将不被扩展。
除非第二次定义(#define)宏与原定义完全相同,否则重定义一个已定义过的宏将产生一个错误信息。
Microsoft特殊处
Microsoft C/C++允许一个宏的重定义,但会产生一个警告信息,说明新的定义与原定义相同。ANSI C认为宏的重定义是错误的。例如,下面的宏对C/C++是相同的,但会产生一个警告信息:
#define test(f1,f2) (f1*f2)
#define test(a1,a2) (a1*a2
)Microsoft特殊处结束
这个例子用于说明#define指令:
#define WIDTH 80
#define LENGTH (WIDTH+10)
第一个说明定义标识符WIDTH为整形常量80,且用WIDTH和整形常量10定义LENGTH。LENGTH的每次出现都用(WIDTH+10)所替换,接着,WIDTH+10的每次出现都用表达式(80+10)替换。WIDTH+10的圆括号非常重要,因为它们决定着如下语句的解释。
var=LENGTH*20;
经预处理后该语句变为:
var=(80+10)*20;
求得值为1800,若无括号,结果为:
var=80+10*20其值为280。
Microsoft特殊处
在文件开头用/D编译器选项定义宏和常量,和用一个#define预处理指令效果是一样的。能用/D选项定义的宏可达30个。
Microsoft特殊处结束
#error指令
采用error指令可产生编译错误信息。
语法
#error 语言符号字符串
错误消息包括语言符号字符串参量,且从属于宏扩展。这些指令对于检测程序的前后矛盾和预处理时的违犯约束是非常有用的,以下例子说明了预处理时的出错处理:
#if !defined(__cplusplus)
#error C++ complier required.
#endif
当遇到#error指令时,编译终止。
#if,#elif,#else和#endif指令
#if、#elif、#else和#endif指令控制源文件中某部分的编译。如果表达式(#if之后)有一个非0值,则紧跟在#if指令之后的行组将保留在转换单元中。
语法
条件的:
if部分 elif部分opt else部分opt endif行
if部分:
if行 文
本if行:
#if 常量表达式
#ifdef 标识符
#ifndef 标识符
elif部分:
elif行 文本
elif部分 elif行 文本
elif行:
#elif 常量表达式
else部分:
else行 文本
else行:
#else
endif行:
#endif
源文件中每个#if指令都必须与最近的一个#endif相匹配。在#if和#endif指令之前的#elif指令的数目是不限的,但最多只能有一个#else指令。
#else必须是#endif之前的最后一个指令。#if、#elif、#else和#endif指令可嵌套在其它#if指令的文本部分。每个嵌套的#else、#elif或#endif指令应属于前面最近的一个#if指令。
所有的条件编译指令,如#if和#ifdef,必须与文件结束前最近的#endif指令匹配;否则,将产生一个错误消息。当条件编译指令包括在包含文件中时,他们必须满足相同的条件:在包含文件结尾没有不匹配的条件编译指令。
宏替换应在#elif命令后的命令行部分内进行,因此一个宏调用可用在常量表达式中。
预处理器选择一个给定文本的出现之一作进一步的处理。文本中指定的一个块可以是文本的任何序列。它可能占用一行以上。通常该文本是对于编译和预处理器有意义的程序文本。
预处理器处理选择文本并将其传送给编译器。若该文本包含预处理器指令,预处理器将执行这些指令。编译器只编译预处理器选定的文本块。
预处理器通过求值每个#if或#elif指令之后的常量表达式直到找到一个为真(非0)的常量表达式来选择单个文本项。预处理器选择所有的文本(包括以#开头的其它预处理器指令)直到它关联的#elif、#else或#endif。
如果常量表达式的所有出现都为假,或者如果没有#elif指令,预处理器将选择#else后的文本块。如果#else被忽略,且所有#if块中的常量表达式都为假,则不选择任何文本块。
常量表达式是一个有以下额外限制的整型常量表达式:
* 表达式必须是整型且可以包括整型常量,字符常量和defined操作符。
* 表达式不能使用sizeof或一个类型造型操作符。
* 目标环境不能表示整数的所有范围。
* 在翻译表示中,int类型和long类型以及unsigned int类型和unsigned long类型是相同的。
* 翻译器可将字符常量翻译成一组不同于目标环境的代码值。为了确定目标环境的属性, 应在为目标环境建立的应用程序中检测LIMITS.H的宏值。
* 表达式不需执行所有的环境查询,但需与目标计算机的执行过程细节隔离开。
预处理器操作符defined可用于特殊的常量表达式,语法如下:
语法
defined(标识符)
defined 标识符
若此标识符当前已定义,则该常量表达式被认为是真(非0);否则,条件为假(0)。一个定义为空文本的标识符可认为已定义。defined指令只能用于#if和#endif指令。
在如下例子中,#if和#endif指令控制着三个函数调用中某一个的编译:
#if defined (CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页