预定义宏与条件编译

作者:云梦泽
时间:2013.11.08
出处:
http://write.blog.csdn.net/postlist
声明:版权所有,侵犯必究,如有转载请声明出处

  在多目标平台的程序时,我们经常使用预定义宏来检测编译环境。通过宏,我们可以使用#ifdef和#endif等预处理指令,就可以使得平台相关代码只在适合于当前的平台的代码上编译,从而在同一套代码中完成对多平台的支持。

先来说说条件编译,条件编译即有条件的编译,当满足系统环境时才对特定代码段进行编译。

一、条件编译

条件编译的一般形式为:

#ifdef 标识符 
程序段1 
#else 
程序段2 
#endif


 

作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。其中#else部分也可以没有,即:

#ifdef 
程序段1 
#endif


有了概念,我们再来看具体如何应用:

1.在头文件中使用#ifdef和#ifnde,防止文件双重定义,比如你在头文件HeadFile.h中定义了一个类A

class A
{

};


 

如果在其他文件中我们#include<HeadFile>两次(不一定只是直接,比如间接地,我们在两个子文件中都包含了该头文件,那么在顶层文件中就会理解为包含了两次),必然会编译错误,因为相同的类我们定义了两次,因此我们在头文件中可这样:

#ifndef  __Flag__
#define  __Flag__
class A
{
};
#endif


 


如此,当你已经包含过该文件了,__Flag__就有了定义,#ifndef条件就为假,不会再执行后面的定义了,这样就避免了双重定义的可能性。#ifdef和#endfi必须成对出现,为了防止头文件被多次包含,在头文件中使用是很有必要的

一般格式如下:

#ifndef  标识符
#define  标识符
......
......
......
#endif


 

还要注意一点的是,这里的标识符原则上命名是自由的,但我们这样讲究,标识符的命名为:__头文件名全大写_H___(注意,两侧的是两根短线连写) ,比如  __STDIO_H__

另外,记得变量一般不要定义在头文件中

二、预定义宏

C/C++中有一些预定义宏,同过这些宏可以使得调试更加方便。

直接上代码看注释:

#include <iostream>
using namespace std;
#ifndef __func__
#define __func__  __FUNCTION__
#endif
void func()
{
	cout<<"func name is:"<<__func__<<endl;    //当前所在函数名,在C++中为__FUNCTION__
	cout<<"func name is:"<<__FUNCTION__<<endl;    
}
int main()
{
	cout<<"date is :"<<__DATE__<<endl;//__DATE__:进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)
	cout<<"time is :"<<__TIME__<<endl;//__TIME__:源文件编译时间,格式微“hh:mm:ss” 
	cout<<"file is :"<<__FILE__<<endl;//__FILE__:当前源代码文件名的字符串文字
	cout<<"line is :"<<__LINE__<<endl;//__LINE__:当前源代码中的行号的整数常量
	func();
	return 0;
}

 

 

 

 


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值