在C语言中,有没有一种方法可以打印出变量/指针的类型?

38
我想要打印出(或者以其他方式确定)我的程序中某个变量的类型。有没有一种好的方法可以做到这一点?所谓好的方法是指,即使意味着故意引发编译器错误,也能够正常工作。
例如:
client.c:55: error: incompatible types in assignment

我现在遇到的是错误。我想要的是它告诉我像下面这样的信息:

client.c:55: error: attempting to assign type struct a to type struct b

或者一个可以这样使用的函数:

printf(gettype(x));

输出的结果为:

struct b

如果它不能编译,它怎么能“工作”呢? - KeatsPeeks
如果它“抛出编译器错误”,它怎么能工作呢? - Alok Singhal
我的意思是“工作”,它会给我类型,这样我就可以修复程序中的错误。请参见编辑。 - Ritwik Bose
一些编译器允许设置详细程度 - 可以尝试一下。否则,只需查看代码即可。一个不错的集成开发环境通常会自动查找变量类型,因此您可以通过悬停或右键单击变量名称来查看类型。 - Max Shawabkeh
1
为了增加详细程度,请在gcc编译器中使用-Wall -pedantic选项。这将为您提供有关错误的一些附加信息。 - manav m-n
5个回答

83

我刚刚发现了如何做到这一点。

printf("%d", variable);
如果变量不是int类型,那么gcc -Wall 将会抱怨类型不匹配,并打印出该变量的类型,这正是你所需要的。

当你处于一个不知道在哪里查找东西的环境中时,这将非常有用(例如,在我的情况下,使用yacc进行编程)。 - Casey Kuball
12
在使用数组类型传递给printf时,由于其会衰减为指针类型,因此这种做法会导致误导。 - Zulan

8

尝试使用GDB进行调试,它将打印与变量相关联的所有属性,包括其类型。但是,在使用GDB之前,您的程序应该先编译。


3
如果构建失败,你就无法做到这一点。 - kursancew

5
如果您使用 gdb 进行调试,您可以通过以下命令设置断点:break 行号 来在想要获取变量类型的位置中断执行。然后,您可以在 gdb 中打印变量的类型: ptype 您的变量名whatis 您的变量名 最后一个命令将打印变量的类型以及您给它指定的定义。

3

在C语言中,当你声明一个变量时,需要提供其类型。编译器在报告赋值错误时只会使用静态类型,而不是运行时对象的类型。

请查看代码并定位到第55行,检查那里有哪些变量,并在代码中找到它们的类型。在C语言中,甚至没有重载,类型是任何语言中最静态和简单的。


1
如果您正在使用 gcc 或兼容的编译器,则可以使用(显然不标准且不可移植的)typeof 关键字,它的作用类似于 sizeof。

13
很不幸,你无法从 typeof 中获取一个字符串。(不过在 g++ 上,你可以使用 typeid(typeof(x)).name()。) - kennytm
1
自C11起,您还可以使用_Generic获取变量的类型 - Anderson Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接