使用#pragma和#ifdef的多行宏

时间:2012-11-27 04:55:58

标签: c++ macros

我对宏有点新鲜,所以很容易,但我们有一个外部库,在windows下编译时会产生大量警告(在Linux上并不是那么糟糕)。它只是一个标题库,所以我不能只关闭整个库的警告,但是我可以禁用每个生成警告的部分(这有点tedius)

所以我想知道是否有可能创建一个宏,所以我可以用几行来代替下面输入以下内容。

#ifdef _WIN32
#pragma warning (push)
#pragma warning(disable : 4355) // 'this' used in base member initialize list
#endif
    code that generates warning
#ifdef _WIN32
#pragma warning (pop)
#endif

然而,当我尝试创建如下面的

之类的宏时
// Disable a warning on win32 platform
// You must call DISABLE_WIN32_PRAGMA_WARN_END afterwards
#define DISABLE_WIN32_PRAGMA_WARN (nnn) \
#ifdef _WIN32 \
#pragma warning (push) \
#pragma warning(disable : nnn ) \
#endif

#define DISABLE_WIN32_PRAGMA_WARN_END \
#ifdef _WIN32 \
#pragma warning (pop) \
#endif

但是在使用VS2012进行编译时出现以下错误

error C2121: '#' : invalid character : possibly the result of a macro expansion
error C2065: 'nnn' : undeclared identifier
error C2351: obsolete C++ constructor initialization syntax
error C2612: trailing 'identifier' illegal in base/member initializer list

2 个答案:

答案 0 :(得分:2)

#ifdef _WIN32

// Disable a warning on win32 platform
// You must call DISABLE_WIN32_PRAGMA_WARN_END afterwards
#define DISABLE_WIN32_PRAGMA_WARN(nnn) \
__pragma (warning (push)) \
__pragma (warning(disable : nnn)) \

#define DISABLE_WIN32_PRAGMA_WARN_END \
__pragma (warning (pop)) \

#else

#define DISABLE_WIN32_PRAGMA_WARN(nnn)
#define DISABLE_WIN32_PRAGMA_WARN_END

#endif

答案 1 :(得分:1)

你可以在头文件中定义序言和结尾,说“warning_arrest_prologue.h”和“warning_arrest_epilogue.h”,其中包含

#ifdef _WIN32
#pragma warning (push)
#pragma warning(disable : 4355) // 'this' used in base member initialize list
#endif

#ifdef _WIN32
#pragma warning (pop)
#endif

分别。然后你可以用以下方式使用它,

#include "warning_arrest_prologue"

// code that generates warning

#include "warning_arrest_epilogue"