gpt4 book ai didi

c++ - 从预处理器标记创建字符串数组

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:10 25 4
gpt4 key购买 nike

我有一个标记列表,我想从中创建一个枚举(普通)和一个字符串数组(稍后用于创建字符串到枚举的映射)。这是我的尝试:

#define TOKEN_LIST  CUBE , SPHERE , CIRCLE
#define CREATE_ARRAY_OF_STRINGS( ... ) const char* token[] = { __VA_ARGS__ };

CREATE_ARRAY_OF_STRINGS( TOKEN_LIST )
// enum SHAPE_TYPE{ TOKEN_LIST }; // easy

int main(int argc, char *argv[])
{
return 1;
}

问题是,当我使用 -E 标志进行编译时,TOKEN_LIST 未被字符串化,如下所示:

const char* token[] = { CUBE , SPHERE , CIRCLE };

int main(int argc, char *argv[])
{
return 1;
}

const char* token[] = { CUBE , SPHERE , CIRCLE }; 应该是 const char* token[] = { "CUBE", "SPHERE", "CIRCLE"};

有没有其他方法可以用 C++03 实现这一点?升压处理器?

最佳答案

如果您愿意稍微更改TOKEN_LIST 的格式,您可以使用Boost.Preprocessor 轻松完成此操作。 .

这是一个使用 Boost.Preprocessor sequence 而不是逗号分隔列表的示例:

#define GENERATE_STRING(maZ, maIdx, maTokens) \
BOOST_PP_STRINGIZE(BOOST_PP_SEQ_ELEM(maIdx, maTokens))

#define GENERATE_STRINGS(maTokens) \
BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(maTokens), GENERATE_STRING, maTokens)

#define TOKEN_LIST (CUBE)(SPHERE)(CIRCLE)

const char* token[] = { GENERATE_STRINGS(TOKEN_LIST) }

enum ShapeType {
BOOST_PP_SEQ_ENUM(TOKEN_LIST)
};

由于您似乎可以访问 ...__VA_ARGS__(不是 C++03 功能),您应该也能够使用 Boost.Preprocessor 元组(用括号括起来的逗号分隔列表);通过支持可变参数宏,Boost.Preprocessor 能够隐式确定元组大小。但是,我没有这方面的经验,所以我无法提供代码示例。


maZ 参数是 Boost.Preprocessor 重复宏的一个实现特性。共有三个:z(由枚举函数使用)、d(由 while 函数使用)和 r(由for 风格的函数)。它仅在嵌套这些结构时有用,因为它允许更快的预处理。如果 GENERATE_STRING 本身调用枚举函数,那么在预处理器上使用 BOOST_PP_ENUM_ ## maZ 比仅使用 BOOST_PP_ENUM 进行嵌套调用更容易(但后者也可以工作,只要您不超过编译器的预处理限制)。

关于c++ - 从预处理器标记创建字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34814276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com