首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从预处理器令牌创建字符串数组

从预处理器令牌创建字符串数组
EN

Stack Overflow用户
提问于 2016-01-15 15:19:38
回答 1查看 1.2K关注 0票数 2

我有一个标记列表,我想从它创建一个enum (琐碎的)和一个字符串数组(稍后用于创建字符串到enum的映射)。以下是我的尝试:

代码语言:javascript
代码运行次数:0
运行
复制
#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;
}

问题是,当我使用TOKEN_LIST标志编译时,没有像下面所示的那样对-E进行字符串化:

代码语言:javascript
代码运行次数:0
运行
复制
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来实现这一点吗?也许是升压处理器?

EN

回答 1

Stack Overflow用户

发布于 2016-01-15 15:45:00

如果您愿意稍微更改一下TOKEN_LIST的格式,那么您可以很容易地使用Boost.Preprocessor完成这一任务。

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

代码语言:javascript
代码运行次数:0
运行
复制
#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(由时间样式函数使用)和r(由for-样式函数使用)。它只在嵌套这些结构时才有用,因为它允许更快的预处理。如果GENERATE_STRING本身正在调用枚举函数,那么在预处理器上使用BOOST_PP_ENUM_ ## maZ将比仅使用BOOST_PP_ENUM进行嵌套调用更容易(但后者也能工作,只要您不超过编译器的预处理限制)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34814276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档