代码之家  ›  专栏  ›  技术社区  ›  Pietro

如何使用其他预处理器指令定义宏?

  •  0
  • Pietro  · 技术社区  · 5 年前

    我正在尝试定义以下宏以禁用特定警告:

    #define HUGE_VAL_DISABLE_WRN #pragma warning( disable : 4005 )
    
    HUGE_VAL_DISABLE_WRN    // <-- errors here
    #include "header.h"
    

    我得到以下错误(都在同一行):

    error C2121: '#' : invalid character : possibly the result of a macro expansion
    error C2146: syntax error : missing ';' before identifier 'warning'
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    error C2065: 'disable' : undeclared identifier
    error C2143: syntax error : missing ')' before ':'
    error C2448: 'warning' : function-style initializer appears to be a function definition
    error C2059: syntax error : 'constant'
    error C2059: syntax error : ')'
    

    我想做的是定义一个包含一些预处理器指令的宏,在某些情况下这些指令可以是空的,但我显然遗漏了一些东西。

    完整的定义是:

    #if (_MSC_VER < REC_VISUAL_CPP_VERS && INTEL_MKL_VERSION < REC_INTEL_MKL_VERS)
    #define HUGE_VAL_DISABLE_WRN_BEGIN \
        _Pragma("warning( push )") \
        _Pragma("warning( disable : 4005 )") // macro redefinition
    #define HUGE_VAL_DISABLE_WRN_END #pragma warning( pop )
    #else
        #define HUGE_VAL_DISABLE_WRN_BEGIN
        #define HUGE_VAL_DISABLE_WRN_END
    #endif
    

    由此我得到:

    error : this declaration has no storage class or type specifier
    error : a value of type "const char *" cannot be used to initialize an entity of type "int"
    error : expected a ";"
    warning : parsing restarts here after previous syntax error
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Pietro    5 年前

    我刚刚发现Microsoft Visual C++(至少到2019版本)不提供 _Pragma 关键字(标准C++11的一部分)。

    他们有自己的,略有不同的, __pragma 关键字:

    #define HUGE_VAL_DISABLE_WRN_BEGIN \
        __pragma(warning( push )) \
        __pragma(warning( disable : 4005 )) // macro redefinition