gpt4 book ai didi

C预处理器: How to create a character literal?

转载 作者:行者123 更新时间:2023-11-30 17:02:40 24 4
gpt4 key购买 nike

出于好奇,我想知道是否可以定义一个宏来将其参数转换为字 rune 字:

 switch(getchar()) {
case MYMACRO(A): printf("Received A\n"); break;
case MYMACRO(a): printf("Received a\n"); break;
case MYMACRO(!): printf("Received an exclamation mark\n"); break;
default: printf("Neither a nor A nor !\n"); break;
}

我想到了两种可能的解决方案:

枚举所有字符

#define LITERAL_a 'a'
#define LITERAL_b 'b'
...
#define MYMACRO(x) LITERAL_ ## x

它不适用于 MYMACRO(!),因为 ! 不是 C 标识符的有效组成部分。

将参数转换为字符串

#define MYMACRO(x) #x [0]

它涉及指针取消引用,并且在 case 标签等地方无效。

我并不是在寻求一种“改进”上述 switch 语句本身的方法。这只是一个玩具示例。重复。这只是一个玩具示例。

最佳答案

虽然我无法得到 user4098326 的编译答案,但我确实得到了下面的解决方案来编译并按预期工作(在 Code Composer Studio 中)。关键是使用符号连接运算符。但请注意,根据标准,这不应该起作用。单引号 (') 不是有效标记,单引号后跟单个字符 ('a) 也不是有效标记。因此,这些不应该能够成为串联运算符的输入或输出。因此,我不建议实际使用此解决方案。

#define CONCAT_H(x,y,z) x##y##z
#define SINGLEQUOTE '
#define CONCAT(x,y,z) CONCAT_H(x,y,z)
#define CHARIFY(x) CONCAT(SINGLEQUOTE , x , SINGLEQUOTE )

#define DO_CASE(...) case CHARIFY(__VA_ARGS__): printf("Got a " #__VA_ARGS__ "\n"); break

然后:

switch(getchar()) {
DO_CASE(A);
DO_CASE(a);
DO_CASE(!);
default: printf("Neither a nor A nor !\n"); break;
}

关于C预处理器: How to create a character literal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36481379/

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