在练习GTK +教程的过程中,我遇到了类似这样的示例代码:
gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
所有作者代码在function和()之间都有一个空格,但是类型转换也是如此。 显然gtk_misc_set_alignment()是一个函数,但我该如何判断 GTK_MISC(标签)是函数还是类型转换?
对于noob问题我很抱歉,我是一个noob程序员, 提前致谢
答案 0 :(得分:9)
实际上,GTK_MISC
是一个隐藏了经典"的宏。 C类型。它可能类似于:
#define GTK_MISC(p) ((GtkMisc *)(p))
你可以简单地写一下:
gtk_misc_set_alignment ((GtkMisc *) label, 0, 0);
我不确切知道为什么GTK提供这样的宏,也许他们喜欢"模仿" "功能类似" C ++提供的强制转换。
<强> 修改 强>
好吧,也许我明白了。我没有为GTK_MISC
找到具体的文档,但它似乎与G_OBJECT
完全相同,后者说:
#define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
将
GObject
或派生指针强制转换为(GObject*)
指针。根据当前的调试级别,此函数可以调用某些运行时检查来标识无效的强制转换。
因此,可能GTK_MISC
也会对指针执行一些运行时检查,以检查它是否可以实际转换为GtkMisk *
。你可以说它在某种程度上是C ++中dynamic_cast
的概念。
答案 1 :(得分:5)
使用括号内的类型
完成类型转换( type ) object // typecast
identifier ( argument ) // function call
答案 2 :(得分:4)
在C type(value)
中不是有效演员。这是C ++语法。
答案 3 :(得分:0)
GLib,所以GTK的类型系统与C的类型系统略有不同。 GLib是用C语言开发的,因此它不能像C ++,C#或Java那样拥有真正的类。所以他们必须以某种方式模仿它。每个对象实际上都是一个struct(在本例中是一个struct _GtkMisc),它有一个类字段,在注册类型(类)时会被初始化。类型转换宏检查此字段值,如果“对象”是从请求的类型继承的(在这种情况下,来自GtkMisc),则对其进行“类型化”。如果没有,它会给你一个错误,所以如果你不确定,你可以用GTK_IS _ *()宏检查它,比如
if (GTK_IS_MISC(label))
gtk_misc_set_alignment(label);
关于问题的第二部分,大括号之前的空格是Gnome团队编码标准的一部分,据我所知,这些标准来自GNU编码标准。