VC预处理命令 第3页
若标识符CREDIT已定义,则对于credit的函数调用被编译。若标识符DEBIT被定义,则对于debit的函数调用被编译。若未定义任何标识符,将编译对于printerror的函数调用。
注意,在C和C++中,CREDIT和credit是不同的标识符,因为它们的大小写不一样。
如下例子中的条件编译语句给出了一个名称为DLEVEL的已定义的符号常量:
#if DLEVEL > 5
#define SIGNAL 1
#if STACKUSE == 1
#define STACK 200
#else
#define STACK 100
#endif#else
#define SIGNAL 0
#if STACKUSE==1
#define STACK 100
#else
#define STACK 50
#endif
#endif
#if DLEVEL==0
#define STACK 0
#elif DLEVEL==1
#define STACK 100
#elif DLEVEL > 5
display(debugptr)
;#else
#define STACK 200
#endif
第一个#if块中有两组嵌套的#if、#else和#endif指令。第一组指令仅当DLEVELl>5为真时执行;否则,执行#else之后的语句。
第二组中的#elif和#else指令选择基于DLEVEL值的四个选项之一。常量STACK依据DLEVEL定义为0,100或200。若DLEVEL大于5,则编译语句:
#elif DLEVEL > 5
display(debugptr);
且此时不定义STACK。
条件编译一般用于防止同一头文件的多重包含。C++中在头文件内经常定义类的位置,可使用如下结构来防止多次定义。
//EXAMPLE.H例子头文件
#if !defined(EXAMPLE_H)
#define ExampleE_H
class Example
{
...
};
#endif //!defined(EXAMPLE_H)
上面的代码用于检查符号常量EXAMPLE_H是否已定义。若已定义,该文件就已被包括且不需再处理;如果未定义,常量EXAMPLE_H将被定义,以标记EXAMPLE.H为已经处理。
Microsoft特殊处
条件编译表达式被看作为signed long值,且这些表达式与C++中的表达式采用相同的规则求值。例如,表达式:
#if 0xFFFFFFFFL > 1UL
为真。
Microsoft特殊处结束
#ifdef和ifndef指令
#ifdef和#ifndef指令与使用defined(标识符)操作符的作用是一样的。
语法
#ifdef 标识符
#ifndef 标识符
等同于
#if defined 标识符
#if !defined 标识符
#if指令能用的任何地方都可以用#ifdef和#ifndef指令。当标识符已被定义时,#ifdef标识符语句等同于#if 1;而当标识符未定义或用#undef指令对其反定义时,该语句等同于#if 0。这些指令仅用于检查C或C++源代码中是否出现该标识符,而不是用于检查C或C++源程序中该标识符的说明。
提供这几个指令只为了与该语言的老版本兼容。目前的趋势是偏向于采用defined(标识符)定义常量表达式的#if指令。
#ifndef指令测试与#ifdef相反的条件。若标识符未定义(或已用#undef反定义),其条件为真(非0);反之,条件为假(0)。
Microsoft特殊处
可以使用/D选项从命令行传送标识符,采用/D选项至多可以指定30个宏。检查一个定义是否存在是非常有用的,因为定义可从命令行传送。例如:
//prog.cpp
#ifndef test //这三个语句放在你的代码中
#define final
#endif
CL /Dtest prog.cpp //这是编译的命令
Microsoft特殊处结束
#import 指令
C++特殊处
#import指令用于从一个类型库中结合信息。该类型库的内容被转换为C++类,主要用于描述COM界面。
语法
#import "文件名" [属性]
#import <文件名> [属性]
属性:
属性1,属性2,...
属性1 属性2 ...
文件名是一个包含类型库信息的文件的名称。一个文件可为如下类型之一:
* 一个类型库(.TLB或.ODL)文件。
* 一个可执行(.EXE)文件。
* 一个包含类型库资源(如.OCX)的库文件(.DLL)。
* 一个包含类型库的复合文档。
* 其它可被LoadTypeLib API支持的文件格式。
文件名之前可以有一个目录规格。文件名必须是一个已存在文件的名称。两种格式的区别是当路径未完全说明时,预处理器检索类型库文件的顺序不同。
动作
语法格式
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页