我试图确定编译时C++ 0x功能是否可用。是否有一个通用的预处理器宏?我正在使用Visual Studio 2010的编译器和Intel的编译器。确定C++ 0x可用性
回答
宏__cplusplus
将have a value大于199711L
。
也就是说,并不是所有的编译器都会填充这个值。最好使用罗杰的解决方案。
您有来自草案的引用来保证吗? – 2009-12-29 18:24:04
即使使用'icc -std = C++ 0x',\ _ \ _ cplusplus仍然定义为1. – 2009-12-29 18:26:25
只是Bjarne的网站。我认为他所说的可能会达到标准,但我想这可能并非如此。 – GManNickG 2009-12-29 18:29:23
通常的做法是在编译系统中确定它,并在编译时传递“配置宏”,通常命名为HAS_ *。例如:compiler -DHAS_LAMBDA source.cpp
。
如果你可以从编译器版本宏中确定这个,那么你可以在配置头文件中定义这些宏来检查它;但是,对于任何由命令行选项控制的内容,您都无法执行此操作。然而,您的构建系统确实知道您指定的选项,并且可以使用该信息。
查看boost.config为一个真实的例子和大量关于特定编译器,版本和功能的细节。
我们对nullptr和auto_ptr有类似的问题。下面是我们正在尝试使用,直到somehing标准化:
#include <cstddef>
...
// GCC: compile with -std=c++0x
#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || (__GNUC__ >= 5))
# define HACK_GCC_ITS_CPP0X 1
#endif
#if defined(nullptr_t) || (__cplusplus > 199711L) || defined(HACK_GCC_ITS_CPP0X)
# include <memory>
using std::unique_ptr;
# define THE_AUTO_PTR unique_ptr
#else
# include <memory>
using std::auto_ptr;
# define THE_AUTO_PTR auto_ptr
#endif
它运作良好,在海湾合作委员会和微软的Visual Studio。顺便说一句,nullptr
是一个关键字,不能被测试 - 因此测试的原因是nullptr_t
。
- 1. 检查C++ 0x算法添加的可用性
- 2. C++在任何编译器中的0x库可用性?
- 3. 这是正确的C++ 0x代码吗?
- 4. C++ 0x random_device'std :: runtime_error'
- 5. C++ 0x线程
- 6. C++ 0x中
- 7. template typedef C++ 0x
- 8. 使用的的C++ 0x
- 9. 在C++中使用__thread 0x
- 10. C++ 0x指定的初始化程序
- 11. C++ 0x与Qt Creator
- 12. Qt:CONFIG + = C++ 11,但-std = C++ 0x
- 13. 使用或不使用C++ 0x特性的
- 14. 如何在C++(C++ 0x)中使用'auto'?
- 15. 使用WhoIs来确定域可用性
- 16. 用JSP确定Flash的可用性
- 17. 该程序是否正确 - >使用C++ 0x N3242
- 18. C++ DLL浮点确定性
- 19. 如何确定URL的可用性? (Objective-C)
- 20. 如何使用autoconf与C++ 0x特性的
- 21. 确定Spring Bean的可用属性?
- 22. 确定iCloud Key Value Store的可用性
- 23. 使用不推荐使用的绑定器和C++ 0x lambdas
- 24. C++确定类是可比
- 25. 我可以在C++ 0x模板中使用loki ObjectLevelLockable
- 26. 确定用C
- 27. “双师型” 与的C++ 0x
- 28. 了解C++ 0x功能
- 29. C++ 0x线程问题
- 30. 为AVR编译C++ 0x
我知道这是重复的,我只是找不到它。编辑:这是它:http://stackoverflow.com/questions/1686348/what-is-defined-if-a-compiler-is-cpp0x-compliant – GManNickG 2009-12-29 17:29:13
谢谢GMAN,但只有在完整的标准实施()显然)。即使它有lambda表达式,英特尔也会返回199711 – Steve 2009-12-29 18:46:18
C++ 0x的功能目前是非标准的。没有标准的方式来表明非标准功能的存在。如果您正在寻找个人功能,则必须在构建系统中推出自己的指标。 – 2009-12-29 18:52:13