我的系统编译器(gcc42)可以很好地满足我想要的 TR1 功能,但尝试支持除系统之外的较新编译器版本,尝试访问 TR1 标头时会出现 #error 要求 -std=c++0x 选项,因为它如何与图书馆或类似的集线器接口。
/usr/local/lib/gcc45/include/c++/bits/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
必须提供额外的开关是没有问题的,以支持该系统(FreeBSD)下的 GCC 4.4 和 4.5,但显然它改变了情况!
使用我的系统编译器(g++ 4.2 默认方言):
#include <tr1/foo>
using std::tr1::foo;
使用带有 -std=c++0x 的较新 (4.5) 版本的编译器:
#include <foo>
using std::foo;
无论如何,是否可以使用预处理器来判断 g++ 是否在启用 C++0x 功能的情况下运行?
我正在寻找这样的东西:
#ifdef __CXX0X_MODE__
#endif
但我没有在手册或网上找到任何内容。
按照这个速度,我开始认为生活会更容易,使用 Boost 作为依赖项,而不用担心在 TR4 之前到达的新语言标准......呵呵。
在 gcc 4.4.4 中,似乎只有一个预定义宏暗示 -std=c++0x 有效:
#define __GXX_EXPERIMENTAL_CXX0X__ 1
我无法访问 gcc 4.5.0 ,但你可以自己检查一下:
[16:13:41 0 ~] $ g++ -E -dM -std=c++0x -x c++ /dev/null >b
[16:13:44 0 ~] $ g++ -E -dM -std=c++98 -x c++ /dev/null >a
[16:13:50 0 ~] $ diff -u a b
--- a 2010-06-02 16:13:50.200787591 +0200
+++ b 2010-06-02 16:13:44.456912378 +0200
@@ -20,6 +20,7 @@
#define __linux 1
#define __DEC32_EPSILON__ 1E-6DF
#define __unix 1
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
#define __LDBL_MAX_EXP__ 16384
#define __linux__ 1
#define __SCHAR_MAX__ 127
对于一行命令,
g++ -E -dM -std=c++98 -x c++ /dev/null > std1 && g++ -E -dM -std=c++0x -x c++ /dev/null > std2 && diff -u std1 std2 | grep '[+|-]^*#define' && rm std1 std2
给你类似的东西:
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)