忽略有时有更好的非宏方法可以做到这一点(遗憾的是,我有充分的理由),我需要使用宏编写一大堆通用代码。本质上是一个宏库,将为某些预先指定的类型生成大量函数。
为了避免破坏大量预先存在的单元测试,库必须做的一件事是,对于每种类型,生成该类型的名称以全部大写进行打印。例如,类型“flag”必须打印为“FLAG”。
我可以手动为每种类型写出常量,例如
#define flag_ALLCAPSNAME 标志
但这并不理想。我希望能够以编程方式执行此操作。
目前,我已经一起破解了这个:
char capname_buf[BUFSIZ];
#define __MACRO_TO_UPPERCASE(arg) strcpy(capname_buf, arg); \
for(char *c=capname_buf;*c;c++)*c = (*c >= 'a' && *c <= 'z')? *c - 'a' + 'A': *c;
__MACRO_TO_UPPERCASE(#flag)
它在某种程度上做了我想要的(即在这段代码之后,capname_buf 的内容为“FLAG”),但我更喜欢一个允许我使用宏定义字符串文字的解决方案,避免需要这个愚蠢的缓冲区。
我看不到如何做到这一点,但也许我错过了一些明显的东西?
我编写了一个可变参数 foreach 循环宏(就像这个),但是我不能改变由#flag 生成的字符串文字的内容,并且在任何情况下,我的循环宏都需要一个字符指针列表来迭代(即它迭代列表,而不是索引等)。
想法?