C语言预处理之条件编译

这是stdio.h的头几行:
#if     _MSC_VER > 1000
#pragma once
#endif
#ifndef _INC_STDIO
#define _INC_STDIO
#if     !defined(_WIN32) && !defined(_MAC)
#error ERROR: Only Mac or Win32 targets supported!
#endif
...
 
我们知道条件编译有好几种形式:
1. 第一种形式:
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有, 即可以写为:
#ifdef 标识符
程序段 #endif
2. 第二种形式:
#ifndef 标识符
程序段1
#else
程序段2
#endif
与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译。这与第一种形式的功能正相反。
3. 第三种形式:
#if 常量表达式
程序段1
#else
程序段2
#endif
它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。
举例:
#if     ( !defined(_MSC_VER) && !defined(__cdecl) )
#define __cdecl
#endif
这里涉及到defined(),用于判断括号中的变量是否被定义。
 
我们在写条件编译语句时一般写成:
#ifndef     _INC_STDIO
#define     _INC_STDIO     常量
#endif
当然这里的名字不合适,我只是表意一下。
但在很多程序的源代码中,只定义了标识符而没有定义常量(value)!就像前面程序中的
#ifndef _INC_STDIO
#define _INC_STDIO
 
这下我就不明白了,怎么能没有值呢?以后怎么用啊?
查了好多网页和问了好几个人,终于差不多搞明白了。
结论:_INC_STDIO只是一个标识符,可以不定义值。这个标识符可以用来控制程序的流程。如果没有定义标识符XXX,则定义标识符XXX。
 
条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率。
使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。
 
下面这段程序有点不解:为什么输出两次_A_ is defined!?
我认为只输出一次,但运行了一下(VC 6.0),居然输出了两次!
希望各位大虾们不吝赐教,谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值