__cplusplus注意事项

__cplusplus注意事项

__cplusplus是C++编译器内部定义的宏,用于定义c++编译器的版本,一般开发人员用此宏判断是c程序还是c++程序,除此外,不清楚__cplusplus的其余用途,其实C++11中,__clpusplus则被定义为201103L,c++14中,则被定义成201402L,这些值在系统 头文件中有用到,下面举个例子:

decay_t是个类型,c++14中定义,位于头文件type_traits中,笔者最近在做qt的国产化,将qt的工程从windows下迁移到linux下,结果linux下就是编译不过,报decay_t不存在,由于工程量巨大,怕是头文件引用顺序不对导致,笔者心中不甚惶恐,为此笔者单独写个小程序,里面有使用decay_t,如下所示(文件名叫decay.cpp,笔者的gcc版本是8.3.0):

#include 

#include 
#include 


template
void MyPrint(_Fn data1)
{
	typedef std::tuple, std::decay_t<_Fn>> TupType;
	TupType a;
}


using namespace std;


int main(int argc, char* argv[])
{
    int a = 1;

	MyPrint(a);
    return 0;
}

结果编译良好,为此寡人稍微心安了些,接着我用g++ -E decay.cpp -o decay.i进行预编译处理,截图如下

图一__cplusplus注意事项_第1张图片

可以看到decay_t有定义,同理,我在国产化项目中,也进行预编译处理,结果无decay_t定义,截图一段如下:
图二__cplusplus注意事项_第2张图片

图二红色方框的部分在图一中也能找到,但是红色方框下面就不同了,于是到头文件type_traits查看红色方框附近内容,如下图所示:
__cplusplus注意事项_第3张图片
可以看到有个#if __cplusplus >= 201402L的判断,则判断工程中__cplusplus小于201402导致,后面检查编译选项,看到了下面的一段:
mips64el-linux-gnuabi64-g++ -w -c -pipe -g -std=gnu++11
其中gnu++11表示c++11,对应的值是201103,为此问题解决了。

如果想查看当前__cplusplus的值,可以用下面的程序打印:

#include
using namespace std;
int main(){
	cout<<__cplusplus<

你可能感兴趣的:(__cplusplus注意事项)