c++ - 在使用 boost 预处理器序列时避免扩展宏

标签 c++ boost preprocessor boost-preprocessor

我正在尝试获取操作系统和编译器名称作为 C++ 中的字符串。尽管对此有很多疑问,但我没有找到明确的答案。所以我尝试使用 Boost.Predef 1.55,它定义了 BOOST_OS_<OS> 类型的宏。和 BOOST_OS_<OS>_NAME .

因此可以简单地做 if(BOOST_OS_<OS>) return BOOST_OS_<OS>_NAME;对于每个操作系统 boost 支持。与 COMP 的编译器相同而不是 OS .为了避免重复,我想使用 Boost.Preprocessor 并将它们全部放在一个循环中。

我想出的是这个:

#define MAKE_STMT_I2(PREFIX) if(PREFIX) return PREFIX ## _NAME;
#define MAKE_STMT_I(type, curName) MAKE_STMT_I2(BOOST_ ## type ## _ ## curName)
#define MAKE_STMT(s, type, curName) MAKE_STMT_I(type, curName)
#define OS_LIST (AIX)(AMIGAOS)(ANDROID)(BEOS)(BSD)(CYGWIN)(HPUX)(IRIX)(LINUX)(MACOS)(OS400)(QNX)(SOLARIS)(UNIX)(SVR4)(VMS)(WINDOWS)(BSDI)(DRAGONFLY)(BSD_FREE)(BSD_NET)(BSD_OPEN)

    BOOST_PP_SEQ_FOR_EACH(MAKE_STMT, OS, OS_LIST)

但是我遇到了值扩展到很快的问题。例如。 VMS 已经定义了一个名为 VMS 的宏然后在 OS_LIST 中被替换.甚至做类似 #define OS_LIST (##AIX##)(##AMIGAOS##)(... 的事情没有帮助,因为它似乎在稍后得到扩展。

如何才能完全避免序列的扩展?

最佳答案

由于您依赖未定义的 token VMS,因此一个快速的解决方案是简单的 #undef VMS。显然,为了避免破坏依赖于该宏的代码,您应该将 Boost PP 代码放在它自己的 .cpp 文件中。

关于c++ - 在使用 boost 预处理器序列时避免扩展宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47435453/

相关文章:

c++ - 在 OpenCV 上组织 channel

c++ - 如何使用 cv-qualifier 调用重载的成员函数?

c++ - 调用 weakref 传递的 Python 函数

c++ - 错误 : 'subrange' is not a member of 'boost::numeric::ublas'

preprocessor - 在 cpp 中截断字符串(预处理器)

c++ - 程序输出 "nan"

C++ 头函数

c++ - 获取指向类型的boost shared_ptr

java - 如何配置 IntelliJ IDEA 以允许 Java 文件中的 shebang

c++ - 定义宏后的哈希符号?