gpt4 book ai didi

c - 是否可以使用预处理器(宏)将 C 字符串文字转换为大写?

转载 作者:太空狗 更新时间:2023-10-29 16:47:09 26 4
gpt4 key购买 nike

忽略有时有更好的非宏方法来做到这一点(遗憾的是我有充分的理由),我需要使用宏编写一大堆通用代码。本质上是一个宏库,将为一些预先指定的类型生成大量函数。

为了避免破坏大量预先存在的单元测试,库必须做的一件事是,对于每种类型,生成全部大写的该类型的名称以供打印。例如。类型“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 循环宏(比如 this one ),但我不能改变 #flag 生成的字符串文字的内容,无论如何,我的循环宏需要一个字符指针列表迭代(即迭代列表,而不是索引等)。

想法?

最佳答案

在可移植的 C99 中不可能有一个将常量字符串转换为所有大写字母的宏(特别是因为字母的概念与字符编码有关。UTF8 字母与 ASCII 字母不同)。

但是,您可能会考虑其他一些解决方案。

  • 自定义您的编辑器来执行此操作。例如,您可以编写一些 emacs 代码来根据需要更新每个 C 源文件。

  • 在你的 C 源代码上使用一些预处理器(也许是一个简单的 C 代码生成器脚本,它会在一些 #include-d 中发出一堆 #define文件)。

  • 使用 GCC extensions或许有

    #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; )}
  • 自定义 GCC,可能使用 MELT (一种扩展 GCC 的领域特定语言),以提供您的 __builtin_capitalize_constant 来完成这项工作(编辑:MELT 现在是一个不活跃的项目)。或者用 C++ 编写您自己的代码 GCC plugin这样做(注意,它只适用于一个给定的 GCC 版本)。

关于c - 是否可以使用预处理器(宏)将 C 字符串文字转换为大写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12455582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com