我正在尝试获取操作系统和编译器名称作为 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/