浅析C++标准头文件结构
ne ONE 1 #define TWO 2 #define THREE (ONE+TWO) 注意上面的宏定义使用了括号。尽管它们并不是必须的。但出于谨慎考虑,还是应该加上括号的。例如:
预处理过程把上面的一行代码转换成:
如果没有那个括号,就转换成six=ONE+TWO*TWO;了。 宏还可以代表一个字符串常量,例如:
2.带参数的#define指令 带参数的宏和函数调用看起来有些相似。看一个例子:
可以时任何数字表达式甚至函数调用来代替参数x.这里再次提醒大家注意括号的使用。宏展开后完全包含在一对括号中,而且参数也包含在括号中,这样就保证了宏和参数的完整性。看一个用法:
展开后为(8+2)*(8+2)*(8+2); 如果没有那些括号就变为8+2*8+2*8+2了。 下面的用法是不安全的:
如果Cube是一个函数,上面的写法是可以理解的。但是,因为Cube是一个宏,所以会产生副作用。这里的擦书不是简单的表达式,它们将产生意想不到的结果。它们展开后是这样的:
很显然,结果是10*11*12,而不是10*10*10; 那么怎样安全的使用Cube宏呢?必须把可能产生副作用的操作移到宏调用的外面进行:
3.#运算符 出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。例如:
宏定义中的#运算符告诉预处理程序,把源代码中任何传递给该宏的参数转换成一个字符串。所以输出应该是adhfkj15. 4.##运算符 ##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。看下面的例子:
最后程序的输出为:123 aabbcc 千万别担心,除非需要或者宏的用法恰好和手头的工作相关,否则很少有程序员会知道##运算符。绝大多数程序员从来没用过它。 三、条件编译指令 条件编译指令将决定那些代码被编译,而哪些是不被编译的。可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。 1.#if指令 #if指令检测跟在制造另关键字后的常量表达式。如果表达式为真,则编译后面的代码,知道出现#else、#elif或#endif为止;否则就不编译。 2.#endif指令 #endif用于终止#if预处理指令。
由于程序定义DEBUG宏代表0,所以#if条件为假,不编译后面的代码直到#endif,所以程序直接输出Running.如果去掉#define语句,效果是一样的。 3.#ifdef和#ifndef
#if defined等价于#ifdef; #if !defined等价于#ifndef 4.#else指令 #else指令用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码。#endif指令将中指上面的条件块。
5.#elif指令 #elif预处理指令综合了#else和#if指令的作用。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |