gpt4 book ai didi

可以使用多个 _Generic 来创建字符串文字吗?

转载 作者:太空狗 更新时间:2023-10-29 15:32:08 27 4
gpt4 key购买 nike

有没有办法在同一表达式中多次使用 _Generic 关键字来创建单个字符串文字?

我正在寻找的是一种生成单一格式字符串以传递给 printf 的方法,所有转换说明符都适合适当的类型。

this时答案我最终得到了一个相当丑陋的解决方法:

#include <stdio.h>

typedef struct {
int a;
char b;
long c;
} ABC;

// printf conversion specifiers:
#define CS(x) \
_Generic((x), \
int: "%d", \
char: "%c", \
long: "%ld")


int main (void)
{
ABC abc = {1, 'a', 2};

printf(CS(abc.a), abc.a); printf(" ");
printf(CS(abc.b), abc.b); printf(" ");
printf(CS(abc.c), abc.c); printf(" ");

return 0;
}

6 个 printf 调用而不是 1 个,不太理想。

问题是我找不到通过预处理器组合 _Generic 和字符串文字连接的方法,如下所示:

printf(CS(abc.a) " ", abc.a); // doesnt work
printf(CS(abc.a) CS(abc.b), abc.a, abc.b); // doesnt work either

因为显然泛型宏在预处理器中不算作字符串文字,所以字符串文字连接是不可能的。我玩弄了“字符串化”宏,但没有成功。

最佳答案

我要说答案是否定的。

首先,_Generic 关键字不是(也不可能是)预处理器指令。 generic-selection 是第 6.5.1 节中定义的主要表达式。给定输入

printf(CS(abc.a) "hello", abc.a);

预处理器的输出(由 -E 编译器选项生成)是:

printf(_Generic((abc.a), int: "%d", char: "%c", long: "%ld") "hello", abc.a);

请注意,字符串连接是不可能的,因为 generic-selection 尚未被评估。另请注意,预处理器无法评估,因为它需要知道 abc 是类型 ABC 的结构,它具有成员 a .预处理器做简单的文本替换,它不知道这些事情。

其次,第 5.1.1.2 节中定义的编译器阶段不允许在字符串连接之前评估 _Generic 关键字。规范中引用的相关阶段是

  1. Adjacent string literal tokens are concatenated.

  2. White-space characters separating tokens are no longer significant. Each preprocessing token is converted into a token. The resulting tokens are syntactically and semantically analyzed and translated as a translation unit.

_Generic 关键字必须在阶段 7 中进行评估,因为它需要的知识只有在对标记进行句法和语义分析后才可用,例如abc 是一个包含成员 a 的结构。因此,多个 _Generic 关键字不能利用字符串连接来生成单个字符串文字。

关于可以使用多个 _Generic 来创建字符串文字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34392467/

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