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)
- C语言的编译期行为(一) defined预处理函数
- C语言的编译期行为(二) #error预处理器指令
- C语言的编译期行为(三) #的妙用
- C语言的编译期行为(前言)
- C语言的编译预处理(38)
- [C++]函数与编译预处理(一)
- C语言编译预处理
- 【C语言】编译预处理
- C语言编译预处理
- C语言编译预处理
- C语言编译预处理
- C语言的预处理、编译、汇编、链接
- 入门c++(一、编译预处理)
- C 语言常用的预处理-宏函数
- C语言编译预处理技术一本道来
- 【C语言复习(三十)】函数的调用行为
- C语言中的编译预处理
- C语言的预处理
- cross compile toolchain for arm/android
- read write 调用过程 文件读写 分析
- APUE 习题10.5 - Implementing Software Timer
- 简单搜索1979@POJ
- 地面站
- C语言的编译期行为(一) defined预处理函数
- asp.net网站中上传文件代码
- Java基础温习
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
- Windows编程(6)|SDK的GDI
- java与mysql乱码的问题
- BLOG
- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"问题解决 .
- atmega8 Flash的使用