同时定义数组和符号索引

Mik*_*ell 1 c syntax

我正在尝试一种聪明的方法(在C中)创建一个字符串数组,以及数组索引的符号名称(枚举或#define),在一个结构中便于维护.就像是:

const char*strings [] = {M(STR_YES,"yes"),M(STR_NO,"no"),M(STR_MAYBE,"maybe")};

其结果相当于:

const char*strings [] = {"yes","no","maybe"}; 枚举索引{STR_YES,STR_NO,STR_MAYBE}; (或#define STR_YES 0等)

但是我在这种情况下为如何构造M宏绘制了一个空白.

任何聪明的想法?

Joh*_*itb 6

clang编译器源中使用的一种技术是创建.def包含这样的列表的文件,该列表的设计类似于C文件,可以轻松维护而无需触及使用它的其他代码文件.例如:

#ifndef KEYWORD
#define KEYWORD(X)
#endif
#ifndef LAST_KEYWORD
#define LAST_KEYWORD(X) KEYWORD(X)
#endif

KEYWORD(return)
KEYWORD(switch)
KEYWORD(while)
....
LAST_KEYWORD(if)

#undef KEYWORD
#undef LAST_KEYWORD
Run Code Online (Sandbox Code Playgroud)

现在,它做的是包括这样的文件:

/* some code */
#define KEYWORD(X) #X, 
#define LAST_KEYWORD(X) #X

const char *strings[] = { 
#include "keywords.def"
};

#define KEYWORD(X) kw_##X, 
#define LAST_KEYWORD(X) kw_##X

enum { 
#include "keywords.def"
};
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你可以做类似的事情.如果您可以使用STR_yes,STR_no...作为枚举器名称,您可以使用与上面相同的方法.否则,只需传递宏两件事.一个小写名称和一个大写名称.然后你可以将上面想要的那个字符串化.

  • 这种技术称为X-Macros - http://en.wikipedia.org/wiki/C_preprocessor#X-Macros (2认同)