【发布时间】:2018-05-06 05:40:18
【问题描述】:
我正在尝试将操作系统和编译器名称作为 C++ 中的字符串。尽管对此有很多问题,但我没有找到明确的答案。所以我尝试使用 Boost.Predef 1.55,它定义了 BOOST_OS_<OS> 和 BOOST_OS_<OS>_NAME 类型的宏。
因此,对于每个操作系统增强支持,您都可以简单地使用if(BOOST_OS_<OS>) return BOOST_OS_<OS>_NAME;。对于使用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##)(... 的事情也无济于事,因为它似乎在以后会得到扩展。
如何才能完全避免序列中的扩展?
【问题讨论】:
-
在令牌中包含_s?
-
什么意思?如果我这样做
VMS_s我将无法从那里获得 boost 宏 -
将
_从## _ ##中的MAKE_STMT_I移动到_CYGWIN或者你有什么。 -
大部分操作系统宏都是这样定义的。所以这会使情况变得更糟。 boost.org/doc/libs/1_55_0/libs/predef/doc/html/predef/reference/…
-
(##AIX##)也是非法的,因为(AIX)不是单个预处理器令牌。
标签: c++ boost preprocessor boost-preprocessor