【问题标题】:macro: string literal from char literal宏:来自 char 字面量的字符串字面量
【发布时间】:2014-10-01 11:35:30
【问题描述】:

C 中有没有一种方法可以使用宏从字符文字创建字符串文字?

例如我有

'a'

我想创建字符串文字

"a"

澄清问题:

#define A 'a'

write(fd, "x=" CHAR2STRING(A) "\n", 4);

我的问题是如何定义宏 CHAR2STRING

【问题讨论】:

  • 内联宏? (没有var decls)?我也很好奇,一个是两个char 宽,另一个是一个。您可能建议将 second 字符(终止符)存储在哪里?甚至不打算将一个 eval'ing 作为地址,这仍然需要解决。
  • @WhozCraig - 它应该在编译时进行评估。我希望它的存储方式与我在代码中直接使用“a”的方式相同(而不是指示编译器生成它)。
  • A 宏必须是字符字面量,不能是其他字符,例如 97 或 0x61?你不能通过将A 设为字符串文字并为A 的其他用途编写一个STRING2CHAR(A) 宏来做相反的事情吗?
  • 我认为这是不可能的。但是,您可以定义a,然后从中生成'a'"a"
  • @mafso *"a" 而不是 'a'

标签: c c-preprocessor


【解决方案1】:

–问题的cmets摘要–

这似乎是不可能实现的。作为替代方案,可以定义字符串文字并改为编写 STRING2CHAR 宏:

#define A "a"
#define STRING2CHAR(s) (*(s))
write(fd, "x=" A "\n", 4);
putchar(STRING2CHAR(A));

#define A a
#define XSTR(s) #s
#define SYM2CHAR(sym) (*XSTR(sym))
#define SYM2STRING(sym) XSTR(sym)

表达式 *"a" 不是编译时常量(例如,它不能用作具有非自动存储持续时间、非 VLA 数组长度、case 标签或位域宽度),尽管编译器应该能够在编译时对其进行评估(使用 Gcc 和 Clang 测试)。


M OehmMatt McNabb推荐。

【讨论】:

    【解决方案2】:

    你可以这样做

    #define A 'a'
    #define X(macro) #macro
    #define CHAR2STRING(macro) X(macro)
    
    printf("%s\n", CHAR2STRING(A));
    

    你会得到'a'而不是a,但也许这对你来说没问题。

    【讨论】:

      【解决方案3】:

      不是很优雅,但很有效:

      #define STRING_ME(tgt, ch) tgt[0]=ch;tgt[1]='\0'
      

      假设 tgt 有 2 个字符的空间。或许你可以举一个你想要的例子?

      【讨论】:

      • @mafso:正确,但答案早于示例,稍后添加以澄清。
      猜你喜欢
      • 2016-03-15
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      • 2016-05-27
      • 2018-05-06
      相关资源
      最近更新 更多