有没有办法将gcc' typeof
扩展名转换为字符串,例如:
#define printType(a) printf("%s", #typeof(a))
所以我可以这样做:
int a = 4;
printf("Type of a is: ");
printType(a);
获得输出:
Type of a is: 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;
}
如果可能,它应该适用于所有类型,包括结构和联合,而不依赖于手动将每个类型添加到列表中。
答案 0 :(得分:17)
从C11开始,您可以使用泛型,请参阅http://en.cppreference.com/w/c/language/generic。例如:
#define printType(a) printf("%s", _Generic( (a) , \
int : "int", \
long : "long", \
float : "float", \
default : "other type"))(a)
需要列出每种可以使用的类型。
在C ++中,还有typeid
关键字:
#include <typeinfo>
#define printType(a) std::cout << typeid(a).name() << std::endl;
答案 1 :(得分:5)
pre 处理器在编译器之前运行。所以它的所有替换都是在实际编译开始之前执行的。 typeof()
由编译器进行评估,编译器只会看到一个显然不会被评估的字符串"typeof()"
。
所以,答案是:不是在C11之前。对于C11,请参阅@tmlen的答案,但请注意,_Generic
类型选择器存在一些歧义,这些选择器在不同编译器中的解析方式不同,可能导致合格类型出现问题。有关此问题的缺陷报告,请阅读Jens Gustedt的blob了解详情:https://gustedt.wordpress.com/2015/05/11/the-controlling-expression-of-_generic/#more-2256(他还提交了缺陷报告http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_423.htm)。