Joh*_*tte 10 c macros c-preprocessor
忽略有时候有更好的非宏方式来做这件事(遗憾的是我有充分的理由),我需要使用宏编写一大堆通用代码.本质上是一个宏库,它将为某些预先指定的类型生成大量函数.
为了避免破坏大量预先存在的单元测试,库必须做的一件事是,对于每种类型,在所有大写字母中生成该类型的名称以进行打印.例如,类型"标志"必须打印为"标记".
我可以手动写出每种类型的常量,例如
#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)
Run Code Online (Sandbox Code Playgroud)
我在某种程度上做了我想做的事情(即在这段代码之后,capname_buf将"FLAG"作为其内容),但我更喜欢一种允许我使用宏来定义字符串文字的解决方案,避免了对此的需要愚蠢的缓冲.
我看不出怎么做,但也许我错过了一些明显的东西?
我有一个可变的foreach循环宏写(像这一个),但我不能改变#flag生成的字符串文字的内容,并且无论如何,我的循环宏需要一个字符指针列表来迭代(即它迭代列表,而不是索引等.
思考?
Bas*_*tch 15
便携式C99中不可能有一个将常量字符串转换为全部大写字母的宏(特别是因为字母的概念与字符编码有关.UTF8字母与ASCII字母不同).
但是,您可以考虑其他一些解决方案.
定制你的编辑器来做到这一点.例如,您可以编写一些emacs代码,根据需要更新每个C源文件.
在你的C源代码上使用一些预处理器(也许是一个简单的C代码生成器脚本,它会#define在某些#include-d文件中发出一堆).
也许使用GCC扩展
#define TO_UPPERCASE_COUNTED(Str,Cnt)
#define TO_UPPERCASE(Str) TO_UPPERCASE_COUNTED(Str,__COUNT__) {( \
static char buf_##Cnt[sizeof(Str)+4]; \
char *str_##Cnt = Str; \
int ix_##Cnt = 0; \
for (; *str_##Cnt; str_##Cnt++, ix_##Cnt++) \
if (ix_##Cnt < sizeof(buf_##Cnt)-1) \
buf_##Cnt[ix_##Cnt] = toupper(*str_##Cnt); \
buf_##Cnt; )}
Run Code Online (Sandbox Code Playgroud)定制GCC,可能使用MELT(一种特定于域的语言来扩展GCC),为您提供__builtin_capitalize_constant工作.
| 归档时间: |
|
| 查看次数: |
9493 次 |
| 最近记录: |