【发布时间】:2012-09-09 10:51:16
【问题描述】:
忽略有时有更好的非宏方法可以做到这一点(遗憾的是,我有充分的理由),我需要使用宏编写一大堆通用代码。本质上是一个宏库,可为某些预先指定的类型生成大量函数。
为避免破坏大量预先存在的单元测试,库必须做的一件事是,对于每种类型,生成该类型的名称以全部大写进行打印。例如。类型“flag”必须打印为“FLAG”。
我可以手动为每种类型写出常量,例如
#define flag_ALLCAPSNAME FLAG
但这并不理想。我希望能够以编程方式执行此操作。
目前,我已经一起破解了这个:
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 循环宏(如 this one),但我不能改变由#flag 生成的字符串文字的内容,而且无论如何,我的循环宏需要一个字符指针列表迭代(即迭代列表,而不是索引等)。
想法?
【问题讨论】:
-
@unwind 我看到了,但答案不正确(因此没有用)b/c 它假设你不能在预处理器中进行循环(你可以)。
-
怎么样?您的示例没有显示使用预处理器完成的循环,如果您知道该怎么做,那不应该是您起点的一部分吗?
-
可能一个重要的限制是 C 宏无法将标记拆分为更小的标记,只能粘贴或字符串化它们以生成更大的标记。所以预处理器不能作用于你的类型名称
flag的单个字符。但是,除了标准要求之外,还有其他(更强大的)C 预处理器可用。
标签: c macros c-preprocessor