有没有一种方法可以在同一表达式中多次使用_Generic
关键字以创建单个字符串文字?
我正在寻找的是一种方法,例如生成一个单个格式字符串,以传递给printf
,其中所有的转换说明符都适应于正确的类型。
当我写这个答案时,我最终得到了一个相当丑陋的解决方案:
#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
需要类型信息,而这些信息在预处理器阶段不可用。 - Jens Gustedt...
参数进行评估时完成的,并将它们转换为调用所有返回字符串的格式化函数。在格式化字符串本身中,您只需要放置%s
即可。但是以其当前形式,这相当于hacky。gcc 4.9处理得非常糟糕,并将编译吹到有时超过2GiB的内存占用量。 - Jens Gustedt