C++中是否有预定义的宏,以便代码可以识别标准?C++ 11预定义的宏
例如目前大多数编译器将“数组”放入“tr1”文件夹中,但对于C++ 11,它将成为STL的一部分。所以目前
#include <tr1/array>
但C++ 11
#include <array>
什么是03标准和11标准,以便我可以使用#ifdef
识别预定义宏?
另外,我想有C90和C99的宏?
Thanksx
C++中是否有预定义的宏,以便代码可以识别标准?C++ 11预定义的宏
例如目前大多数编译器将“数组”放入“tr1”文件夹中,但对于C++ 11,它将成为STL的一部分。所以目前
#include <tr1/array>
但C++ 11
#include <array>
什么是03标准和11标准,以便我可以使用#ifdef
识别预定义宏?
另外,我想有C90和C99的宏?
Thanksx
请注意,虽然这可能是你可以做的最好的,但很遗憾它不适用于VC++(叹气)。目前的VC++(对于VS2010)将'__cplusplus'定义为199711L,但仍然只有'array'没有'tr1/array'(但它是用tr1命名空间定义的) – Voo
嗯不好。虽然我猜他们处于困境。他们不能声称是符合0x的标准,因为他们只实现了它的一部分,而且标准仍然还有很长一段路要走 - 但是要实现他们按照标准完成的部分... – jcoder
还要注意GCC修正它,使得'__cplusplus'仅在几周前报告了除'1'(注意:甚至不包括'199711L')之外的东西,所以它在GCC中也不适用,直到4.7.0不存在为止。另外,它并不完全清楚从错误归档中是否会支持比C++ 0x构建更大的“199711L”以外的东西(尽管我猜测它会)。请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - 10年以上的错误。 –
最终,你将不得不使用编译器特定的信息。至少,直到C++ 0x变得更广泛地实现。您基本上需要选择实现某些东西的驱动程序版本,并在其上测试编译器特定的宏。
Boost.Config库有一些可以帮助你的宏。
鸡蛋里挑骨头......
您的特定问题不依赖于你的编译器,它依赖于标准库实现。由于您可以自由选择由您的编译器提供的不同标准库(例如,试用libC++或stlport),因此编译器的特定信息无法帮助您。
因此,最好的办法是自己创建一个特定的头文件,在其中您将选择其中一个或另一个(取决于构建选项)。
// array.hpp
#ifdef STD_HAS_TR1_ARRAY_HEADER
#include <tr1/array>
#else
#include <array>
#endif
然后,您可以记录编译器选项:
传递
-DSTD_HAS_TR1_ARRAY_HEADER
将意味着std::tr1::array
在<tr1/array>
,而不是默认<array>
定义。
你就完成了。
从N3242草案:
16.8 Predefined macro names [cpp.predefined]
...
The name _ _ cplusplus is defined to the value 201103L when
compiling a C++ translation unit. 155)
...
155) It is intended that future versions of this standard will
replace the value of this macro with a greater value.
Non-conforming compilers should use a value with at most five
decimal digits.
它几乎没有与标准做的,这完全取决于你的编译器支持什么。任何编译器都会预先定义一个给出其版本号的宏。请查阅你的编译器文档 –
[确定C++ 0x可用性](http:// stackoverflow。com/questions/1975616/determine-c0x-availability) –
@Hans Passant:失败。 '在编译C++翻译单元时,名称_ _ cplusplus被定义为值201103L。(16.8预定义的宏名称)。 –