作者:云梦泽
时间: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;
}