Метод, используемый в исходном коде компилятора 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
Теперь, что он делает, так это файл, подобный следующему:
/* 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"
};
В вашем случае вы могли бы сделать подобное. Если вы можете использовать STR_yes
, STR_no
, ... в качестве имен перечислителей, вы можете использовать тот же подход, что и выше. В противном случае просто передайте макросу две вещи. Одно строчное имя и одно заглавное имя. Тогда вы можете зачеркнуть тот, который вы хотите, как указано выше.