以下内容节选自本人的文章《C++宏,预处理器,RTTI,typeid与强制类型转换专题》,你可以在本人的文库中下载到这篇文章,下面的代码是本人学习笔记,其中详细讲解了对于C++从C遗传下来的比较烦人的“宏”和"逻辑预处理器"问题。希望看过之后,你对“宏”和"逻辑预处理器"有个车底的了解。
3、 预处理器:预处理器是编译器把C++代码编译为机器指令之前执行的一个过程,所有的预处理器都是#开头,以便与C++语句区分开来,#include预处理器指令在前面已经用过不少了
3.1、#define指令:该指令用于符号置换,其格式为#define 标识符 字符序列。注意该语句不以分号结束。比如#define PI 3.1416就表示把PI置换为3.1416,这里要注意的是虽然PI看起来和变量一样,但PI和变量没有任何关系,PI只是一个符号或标志,在程序代码编译前该符号会用一组指定的字符来代替。还要注意的是3.1416并不是一个数值,而是一个字符串,因此不会进行类型检查。在C++中最好是用const来声名常量,比如const long double PI=3.1416;这样的话PI将会始终保持为long double类型。语句中的字符序列可以是任意的字符序列,而不仅仅是数字,比如#define PI HYONG这样的话在使用PI使就会用HYONG来替换掉PI,当然HYONG这里会是一个未定义的标识符。
3.2、从程序串删除#define定义的标志:在#define语句中,如果没有为标识符指定置换字符串,标识符就会被一个空的字符串来代替,也就是说标识符被删除了,比如#define PI表示在程序中该语句后面删除所有的PI标识符。
3.3、取消#define的定义:可以使用#undef来取消#define定义的标识符,比如#undef PI表示在#undef后面的语句中标识符PI的定义被取消了。
3.4、带参数的#define:其格式为#define 标识符(参数列表) 置换字符串。比如#define f(v) cout<<(v)<
3.6、怎样把预处理指令放在多行上:其方法为使用”\”续行符符号,该符号应在上一行的最后一个字符。
比如#define m \
kkielfml
3.7、#define使用字符串作为参数:比如#define m “kdi”如果有语句cout<
4、逻辑预处理器指令:
4.1、逻辑#if指令:该指令原理与条件语句if相同,如果测试为真就执行后面的语句,如果为假则跳过后面的语句。该指令有两种用法,其一可以用#if指令测试某个符号以前是否用#define指令定义过,这是最常用的用法,其二可以用来测试某个条件表达式是否为真。
4.2、#if指令用法一:测试某个符号是否以前用#define定义过,该用法的指令如下#if defined 标识符 …. #endif 其缩写形式为#ifdef 标识符….#endif表示如果,指定的标识符已被#define定义,则中间的语句就包含在源文件中,如果该标识符还未被#define定义,则跳过#if和#endif之间的语句,该语句以#endif结束,还要注意的是标识符前的关见字是defined比define多一个字母d。
4.3、测试标识符是否不存在:其语法为#if !defined 标识符…..#endif缩写形式为#ifnedf 标识符…..#endif表示如果指定的标识符没有定义,则把#if和#endif之间的语句包含在源文件中,如果标识符已定义则跳过#if和#endif之间的代码,实标上#ifndef语句比#ifdef语句使用得更频繁,因为系统使用该语句防止头文件被多次包含,
4.4、防止头文件被包含多次的方:其方法为#ifndef HY #define HY语句#endif程序在开始遇到标识符HY时没有被定义,这时执行后面的语句,再第二次被使用时则标识符HY已经被定义,这时不会执行后面的语句,从而防止了同一头文件被包含多次的情况。这里要注意使用#define后面定义的标识符不需要值。
4.5、#if语句还可以使用逻辑运算符以测试多个值,比如#if defined HY1&&HY2….#endif当HY1与HY2都为真时才执行,同样还可以使用其他逻辑运算符。
4.6、#if指令用法二:测试某个表达式的值是否为真,其语法格式为:#if 常量表达式….#endif,注意常量表达式的求值结果应是整数常量表达式,比如#if a=2 …. #endif测试a的值是否为2,如果为2则执行#if与#endif之间的语句。
4.7、多个#if选择块:和常规的if语句一样#if也有对应的#else和#elif语句,比如#if a=3 …. #else …. #endif表示如果a=3则执行if后面且在#else前面的语句,如果为假则执行#else与#endif间的语句。#elif用来实现多个选择,该语句和常规语句的else if相似,比如#if a=1 …. #elif a=2 …. #elif a=3…. #else …. #endif表示,如果a=1则执行#if后的语句,如果a=2则执行该条件后的语句。
其实这个很好理解啊!!
它是用预处理来达到定义的目的
如果系统是64位的,
那就定义 POINTER_32 _ptr32
否则定义 POINTER_32
这个标志会在后面的程序中用到!!!
这样理解比较通俗,如果系统是64位的,那就定义 POINTER_32 _ptr32
否则定义 POINTER_32
这是甚麼鬼满意解答,根本是废材