有没有办法在 C 中打印出变量/指针的类型?

Posted

技术标签:

【中文标题】有没有办法在 C 中打印出变量/指针的类型?【英文标题】:Is there a way to print out the type of a variable/pointer in C? 【发布时间】:2011-01-10 18:20:46 【问题描述】:

我想打印出(或以其他方式确定)我的程序中某个变量的类型。有什么好的方法吗?好的,我的意思是一种有效的方式,即使它意味着故意抛出编译器错误。

例如:

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

【问题讨论】:

如果不编译怎么能“工作”? 如果它“抛出编译器错误”,它如何工作? 我所说的“工作”是指它为我提供了类型,以便我可以修复程序中的错误。查看编辑。 一些编译器允许详细设置 - 试试看。否则只看代码。一个不错的 IDE 通常会自动查找变量的类型,因此您可以通过悬停或右键单击变量名称来查看类型。 要增加详细程度,请为您的 gcc 编译器提供 -Wall -pedantic 选项。这应该会给你一些关于你的错误的额外信息。 【参考方案1】:

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

printf("%d", variable);

如果变量不是 int,则 gcc -Wall 会抱怨类型不匹配 - 并将打印出变量的类型,这正是您要查找的。​​p>

【讨论】:

当您处于不知道在哪里查找资料的环境中时很有用(例如,在我的情况下,使用 yacc 进行编程)。 这在使用数组类型时会产生误导,这些类型在传递给printf 时会衰减为指针。【参考方案2】:

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

【讨论】:

如果构建失败,你不能这样做【参考方案3】:

在 C 中,您在声明变量时提供了一个类型。这是编译器在抱怨分配时拥有的唯一信息(也就是说,它不会使用对象的运行时类型,而是使用您拥有的静态类型)。

转到代码,找到第 55 行,检查那里有哪些变量并找到代码中的类型。在 C 中甚至没有重载,类型与任何语言一样静态和简单。

【讨论】:

【参考方案4】:

如果您使用 gcc 或与 gcc 兼容的编译器,那么您可以使用(显然是非标准且不可移植的)typeof 关键字,其工作方式与 sizeof 非常相似。

【讨论】:

很遗憾,您无法从typeof 中获取字符串。 (虽然在 g++ 上你可以使用typeid(typeof(x)).name()。) 从C11开始,也可以使用_Generic到to get the variable's type。【参考方案5】:

如果您使用gdb 进行调试。 然后你可以设置一个断点: break line_number 在您想要获取该变量类型的地方中断执行。 从那时起,您可以使用以下命令在 gdb 中打印变量的类型: ptype your_variable_name 要么 whatis your_variable_name 最后一个将打印变量的类型以及你给它的定义。

【讨论】:

以上是关于有没有办法在 C 中打印出变量/指针的类型?的主要内容,如果未能解决你的问题,请参考以下文章

C指针

如何在 Swift 中打印变量的类型或类?

竞赛(变量定义赋值及转换)

C#内存地址和变量

C语言指针变量怎么转化为普通类型变量?

C语言指针定义