在Visual Studio中测试功能时,我发现了这种奇怪的行为:
#ifndef __cpp_constexpr
#error Opposite day! //Compiler error
#endif
#define test_macro
#ifndef test_macro
#error But only for feature macros? //No compiler error
#endif
int main() {}
__cpp_constexpr
肯定定义,我在实际程序中使用它。
从我的测试来看,似乎功能宏#ifndef
的行为与#ifdef
相似
反之亦然。
这是一个Visual Studio错误,还是我错过了什么?
在VS 2017,Visual C ++ 14或更高版本中编译,启用了C ++ 17标准。
P.S。 Intellisense按预期工作,它只是编译器。
答案 0 :(得分:0)
您使用了错误的预定义宏和预处理代码。下一个代码可以提供帮助:
#if defined(__GNUG__) && (__cplusplus > 201103L)
# define HAS_CONSTEXPR
#elif defined(_MSC_VER) && (_MSC_FULL_VER >= 190024210)
# define HAS_CONSTEXPR
#endif // __GNUG__
#ifndef HAS_CONSTEXPR
# error Opposite day! //Compiler error
#else
# define test_macro
# ifndef test_macro // useless by why not ?
# error But only for feature macros? //No compiler error
# endif
#endif
建议使用boost配置库。它是交叉编译器,您可以像这样解决它:
#ifdef BOOST_NO_CXX11_CONSTEXPR
# error Opposite day! //Compiler error
#endif
它适用于所有受boost支持的编译器(根据boost许可证,您可以检查源代码并复制在您的项目中)