预定义知识
1. 宏指令:
#define #error #import #undef #elif #if #include #else #ifdef #line #endif #ifndef #pragma
2.#define
#define WIDTH 80
#define LENGTH (WIDTH+10)
#define test(f1,f2) (f1*f2)
3.#error
#error 语言符号字符串
采用error指令可产生编译错误信息
#if !defined(NUM_TEN)
#error ten is not defined.
#endif
当遇到#error指令时,编译终止
3.#if,#elif,#else和#endif
#if、#elif、#else和#endif指令控制源文件中某部分的编译。
源文件中每个#if指令都必须与最近的一个#endif相匹配。在#if和#endif指令之前的#elif指令的数目是不限的,但最多只能有一个#else指令。#else必须是#endif之前的最后一个指令。
#if 常量表达式
……………
#elif 常量表达式
…………………
#else
……………………
#endif
表达式必须是整型且可以包括整型常量,字符常量和defined操作符。
预处理器操作符defined可用于特殊的常量表达式
defined(标识符)
defined 标识符
若此标识符当前已定义,则该常量表达式被认为是真(非0);否则,条件为假(0), defined指令只能用于#if和#endif指令。
#if defined (CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
#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
#else
#define STACK 200
#endif
#if _BEEP_DISP_
if(d_dpbeep == 1)
dp_kycodechgreq1() ;
else if(d_dpbeep == 2)
dp_kycodechgreq2() ;
d_dpbeep = 0 ;
#endif
在头文件定义的时候,一般定义如下,防止文件重名:
//文件名为EXAMPLE.H
#if !defined(EXAMPLE_H)
#define ExampleE_H
class Example
{
...
};
#endif
//!defined(EXAMPLE_H)
4. #ifdef和ifndef指令
#ifdef 标识符
#ifndef 标识符
等同于
#if defined 标识符
#if !defined 标识符
当标识符已被定义时,#ifdef标识符语句等同于#if 1;而当标识符未定义或用#undef指令对其反定义时,该语句等同于#if 0。
#ifndef指令测试与#ifdef相反的条件。若标识符未定义(或已用#undef反定义),其条件为真(非0);反之,条件为假(0)。
#ifndef TEST
#define FIANL
#endif
5. #include
你可以把常量和宏定义放在包含文件中,然后用#include指令把这些定义加到任何源文件中。包含文件对于外部变量和复杂数据类型结合的说明也是有用的。有引号和尖号两种,意义不同:
引号格式这种格式指示预处理器先在包含#include语句的文件的相同目录内搜索,然后在任何包括该文件的目录中搜索。随后预处理器沿着/I编译器选项指定的路径搜索,最后是在INCLUDE环境变量说明的路径搜索
尖括号格式这种格式指示预处理器首先在/I编译器选项指定的路径中搜索包含文件。然后在INCLUDE环境变量说明的路径中搜索
6.#line指令
#line指令告诉预处理器将编译器内部存储的行号和文件名转变为一个给定的行号和文件名。。编译器使用该行号和文件名指出编译过程中发现的错误。行号一般指的是当前输入行,文件名指当前输入文件。每处理一行,行号就增1,你可以通过编写一个#line指令来改动源行号和文件名
#line
数字序列 “文件名”
数字序列的值可以是任何整型常数。
文件名可以是任意字符的组合,且应括在双引号(“”)间
#line 151 "copy.c"
7.#undef
#undef指令取消(反定义)一个原来由#define指令创建的名称。
#define WIDTH 80
。
。。
。。
。。
。。
#undef WIDTH
8.预定义的宏
__DATE__ 当前源文件的编译日期
_FILE_ 当前源文件名称。
__LINE_ 当前源文件的行号
__TIME_ 当前文件的最近编译时间。该时间是格式为hh:mm:ss的字符串文字
_TIMESTAMP_ 当前源文件的最近修改日期。日期是格式为Ddd Mmm Datehh:mm:ss yyyy的字符串文字,这里Ddd是星期几的简写,Date是从1到31的一个整数
Microsoft特殊预定义的宏:
__cplusplus 仅为C++程序定义
__CPPRTTI 定义为用/GR编译的代码(允许运行时类型信息)
__CPPUNWIND 定义为用/GX编译的代码(允许异常处理)
__MSC_VER 定义编译器版本,对于Microsoft Visual C++ 6.0定义为1200,它总是定义的
__WIN32 为Win32应用程序而定义。
9.其他
#pragma warning( disable : 4507 34 ) // 禁止警告消息4507和34
#pragma comment(lib,"ddraw.lib ")
#pragma message(messagestring)
该指令不终止编译,直接把一个字符串文字送到标准输出。