c++ - 使用#pragma 和#ifdef 的多行宏

标签 c++ macros

我对宏有点陌生所以放轻松,但我们有一个外部库,当在 Windows 下编译时会生成大量警告(在 Linux 上还不错)。它是一个只有 header 的库,所以我不能只关闭整个库的警告,但我可以禁用生成警告的每个部分(这有点乏味)

所以我想知道是否可以创建一个宏,这样我就可以在几行中完成,而不是在下面键入以下内容。

#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

最佳答案

#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

关于c++ - 使用#pragma 和#ifdef 的多行宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577636/

相关文章:

c++ - 使用程序作为包含主要功能的库

c++ - 包含#include 指令的宏定义

php - 从 PHP 调用 Vowpal Wabbit?

clojure - 将模式和结果作为向量传递给 core.match/match 的宏

vim - 如何在 vim 宏中包含光标移动

c++ - 嵌入式编程中宏值之间的比较是否不好?

c++ - 重新定义自定义删除

C++ 和 pulseaudio "not declared in this scope"

c++ - 如何缩短模板类的类型名称语法

c++ - 反向 vector 的大 O 时间复杂度