C 将typeof转换为字符串

C 将typeof转换为字符串,c,gcc,typeof,C,Gcc,Typeof,有没有办法将gcc的typeof扩展名转换为字符串,例如: #define printType(a) printf("%s", #typeof(a)) #define printType(a) printf("%s", _Generic( (a) , \ int : "int", \ long : "long", \

有没有办法将gcc的
typeof
扩展名转换为字符串,例如:

#define printType(a) printf("%s", #typeof(a))
#define printType(a) printf("%s", _Generic( (a) , \
                                  int : "int", \
                                  long : "long", \
                                  float : "float", \
                                  default : "other type"))(a)
因此,我可以:

int a = 4;
printf("Type of a is: ");
printType(a);
并得到以下输出:

a的类型为:int
可能的用途如下:

#include <stdio.h>

#define indirect_print(a) print_##typeof(a)(a)

void print_int(int *i) {
    printf("%d", *i);
}

void print_char(char *c) {
    printf("%c", *c);
}

int main(void) {
    char C = 'C';
    int I = 100;

    {
        char *a = &C;
        indirect_print(a);
    }

    {
        int *a = &I;
        indirect_print(a);
    }

    return 0;
}
#包括
#定义间接打印(a)打印类型(a)(a)
无效打印_int(int*i){
printf(“%d”,*i);
}
无效打印字符(字符*c){
printf(“%c”,*c);
}
内部主(空){
字符C='C';
int I=100;
{
字符*a=&C;
间接印刷(a);
}
{
int*a=&I;
间接印刷(a);
}
返回0;
}

如果可能,它应该适用于所有类型,包括结构和联合,而不依赖于手动将每个类型添加到列表中。

编译器之前运行预处理器。因此,它的所有替换都是在实际编译开始之前执行的
typeof()
是由编译器计算的,它只会看到一个字符串
“typeof()”
,而这个字符串显然不会被计算


因此,答案是:不适用于C11之前的版本。对于C11,请参见@tmlen的答案,但请注意,
\u Generic
类型选择器存在一些歧义,这些歧义在不同的编译器中得到不同的解决,这可能会导致合格类型出现问题。关于这个问题有一个缺陷报告,请阅读Jens Gustedt的blob了解详细信息:(他还提交了一个缺陷报告)。

自C11以来,您可以使用通用的,请参阅。例如:

#define printType(a) printf("%s", #typeof(a))
#define printType(a) printf("%s", _Generic( (a) , \
                                  int : "int", \
                                  long : "long", \
                                  float : "float", \
                                  default : "other type"))(a)
需要列出可以使用的每种类型

在C++中,也有<代码> Type ID < /C>关键字:

#include <typeinfo>
#define printType(a) std::cout << typeid(a).name() << std::endl;
#包括

#定义打印类型(a)std::你能尝试使用类型泛型宏吗?为什么要这样做?这正是我想要的<代码>\u Generic
对类型选择器有一些含糊不清的地方。在使用限定类型之前,请先查看我答案中的链接。