Я только что попробовал объединение:
#define APOS '
#define CHAR2(a,b,c) a##b##c
#define CHAR1(a,b,c) CHAR2(a,b,c)
#define CHAR(x) CHAR1(APOS,x,APOS)
К сожалению, препроцессор жалуется на неопределенный символ. (и мультисимвол, если у вас более одного персонажа)
Способ просто отключить ошибки препроцессора: (для этого нет специальной опции предупреждения)
-no-integrated-cpp -Xpreprocessor -w
Пример оптимизации во время компиляции с некоторыми другими приемами:
#define id1_id HELP
#define id2_id OKAY
#define LIST(item,...) \
item(id1, ##__VA_ARGS__)\
item(id2, ##__VA_ARGS__)\
item(id1, ##__VA_ARGS__)\
#define CODE(id,id2,...) ((CHAR(id##_id) == CHAR(id2##_id)) ? 1 : 0) +
int main() { printf("%d\n", LIST(CODE,id1) 0); return 0; }
Возвращает «2», поскольку есть два элемента с идентификатором1.