C语言的编译期行为(一) defined预处理函数

来源:互联网 发布:安知鸿鹄之志上一句 编辑:程序博客网 时间:2024/05/17 02:52

C语言预处理器本质上来说拥有一套很独立的语法,以区别于C语言其它代码。在编译器读取源程序前,由预处理器负责处理掉代码中所有的预处理器命令。从本篇起,陆续列出一些不那么常见但有用的预处理器命令的用法。


defined预处理函数

有两种写法:
defined name
defined(name)

有些书上把它叫做预处理函数,此处也采用这种说法。它的作用是:如果一个名称已经被定义(#define),那么它返回1,否则返回零。它仅在#if和#elif表达式中可以使用。因为#if和#elif要求后面接一常量表达式,当此常量表达式非零时,即判断条件成立,所以 #ifdef name与 #if defined name 是等价的。

本人认为这个预处理函数主要用在以下两种情况下:

1. 需要使用#elif时:因为#ifdef和#ifndef没有相对应的表达else if逻辑的预处理器命令,所以在需要实现else if逻辑时,需要使用defined预处理函数。

2. 某些复杂的常量表达式:例如判断多个预处理名称的被定义状态时。

以下代码在注释中说明了defined关键字的上述两种用法。

#include <stdio.h>#define CONDITION_A#define CONDITION_Bint main(int argc, char** argv){#ifdef CONDITION_A    printf("CONDITION_A\n");     // 定义了CONDITION_A,所以此行进入预处理后代码中#elif defined CONDITION_B    printf("CONDITION_B\n");     // if条件已经为真,此行不会进入预处理后代码中#else    printf("CONDITION_OTHER\n"); // if条件已经为真,此行不会进入预处理后代码中#endif// 定义了CONDITION_A和CONDITION_B,所以此行进入预处理后代码中#if defined(CONDITION_A) && defined(CONDITION_B)    printf("CONDITION_A AND CONDITION_B\n");#endif    return 0;}

程序输出结果为:
CONDITION_A
CONDITION_A AND CONDITION_B


补充说明:本示例源代码注释采用C++单行注释样式,即//样式。标准C语言C99版也支持这种注释格式,且当前流行的C编译器都提供了对这种注释的支持。以后的源代码中也将使用这种注释格式。


(■版权声明: 原创内容,转载仅限非商业用途,并需注明出处: http://blog.csdn.net/LoveASPDotNet)