ifdef ifndef的区别

本文转自:http://blog.sina.com.cn/s/blog_4b9216f50100bty6.html


ifdef与ifndef的区别:
ifdef:如果标识符被定义,则执行程序段1,否则执行其他程序段
ifndef:与ifdef相反,如果标识符未被定义,则执行程序段1,否则执行其他程序段2

#ifndef#define#endif的用法

条件编译:对指定内容设定编译的条件
1. 使用该方法只是为了进行条件编译,当条件满足是才进行编译
#ifdef 标识符
程序段1

#else
程序段2

#endif
上述语句作用是当标识符已经被定义过,则对程序段1进行编译,否则编译程序段2

2. 如果一个C源程序在不同计算机系统上系统上运行,而不同的计算机又有一定的差异。如:

我们有一个数据类型,在windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这

样往往需要对源程序作必要的修改,这就降低了程序的通用性,可以用一下的条件编译:

#ifdef WINDOWS
#define MYTYPE long
#else
#define MYTYPE float
#define

如果在windows上编译程序,则可以在程序的开始加上
#define WINDOWS

这样则编译下面的命令行:
#define MYTYPE long
否则编译:
#define MYTYPE float

3. 在调试程序时,常常希望输出一些需要的信息,而在调试完成后不再输出这些信息,可以在源程序中

插入以下的条件编译段:

#ifdef DEBUG
print("device_open(%p)\n",file);
#endif

如果在前面有以下命令行:
#define DEBUG
则在程序运行是输出file指针的值

#ifndef

1. 文件中的#ifndef,这是一个很关键的东西,比如你有两个C文件,这两个C文件都include了同一个头文

件,而编译时,这两个C文件要编译成一个可运行文件,于是问题来了,大量的声明冲突

#ifndef <标识>
#define <标识>

#endif
<标识>在理论上来说可以自由命名,但每个头文件的这个”标识“都应该是唯一的。
<标识>规则一般是头文件名全大写,前后加下划线,并把文件名的"."换成下划线,如:
stdio.h --> _STDIO_H
2. 在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)

#ifndef AAA
#define AAA
......
..
int i;
#endif
里面有一个变量的定义,在vc中链接时就出现了i重复定义的错误,而在c中成功编译。
结论:
1> 当你第一个使用这个头的.cpp文件生成.obj的时候,inti在里面定义了当另外一个使用这个的.cpp再

次(单独)生成.obj的时候,inti又被定义然后两个obj被另外一个.cpp也include这个头,连接在一起,

就会出现重复定义
2> 把源程序文件扩展名改为.c后,vc按照c语言的语法对源程序进行编译,而不是C++,在C语言中,若遇

到多个int i,则自动认为其中一个是定义,其他的是声明。
解决方法:
1. 把源程序文件扩展名改为.c
2. 推荐解决方法
<x.h>
#ifndef _X_H
#define _X_H
extern int i;
#endif
<x.c>
int i;

注意问题:
(1) 变量一般不要定义在.h文件中

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值