功能测试宏在Visual C ++中无法正常工作

时间:2018-03-16 09:05:24

标签: c++ visual-studio visual-c++ macros

在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按预期工作,它只是编译器。

1 个答案:

答案 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许可证,您可以检查源代码并复制在您的项目中)