我对以下代码片段中缺少函数 glade_project_get_type 的实现代码感到困惑。
来自 .c 文件:
project = g_object_new (GLADE_TYPE_PROJECT, NULL);
来自关联的头文件:
#define GLADE_TYPE_PROJECT (glade_project_get_type ())
这似乎是 glade_project_get_type()
的声明:
GType glade_project_get_type (void) G_GNUC_CONST;
/* From glib/gmacros.h:
#define G_GNUC_CONST __attribute__((__const__))
__attribute__((const)) function attribute
Many functions examine only the arguments passed to them and have no effects
except for the return value.
If a function is known to operate only on its arguments then it can be subject
to common sub-expression elimination and loop optimizations.
*/
我在任何地方都找不到 glade_project_get_type() 的实现代码,但是软件编译没有错误,所以显然有一些我不明白的地方。
我预计会有类似这样的东西:
GType glade_project_get_type (void)
{
GType aType;
< some code giving a value to aType >
return aType
}
那么,关于 C 编程,我不了解什么?
最佳答案
实现 glade_project_get_type
的代码在库 libgladeui
中,它单独编译并与 glade
可执行文件链接。
libgladeui
的源代码与 glade
的源代码一起发布。函数 glade_project_get_type
的定义在文件 glade-project.c
中。您不会在该文件中找到字符串 glade_project_get_type
,因为该函数的实际代码是复杂宏扩展的结果,来自 glade_project_get_type
的以下行:
G_DEFINE_TYPE_WITH_CODE (GladeProject, glade_project, G_TYPE_OBJECT,
G_ADD_PRIVATE (GladeProject)
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
glade_project_model_iface_init)
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE,
glade_project_drag_source_init))
此宏在glib
的头文件中定义,特别是gobject/gtype.h
。在其扩展的某个时刻,我猜 token pasting (##
预处理器指令)将用于获取传递给宏的标记之一(此处为 glade_project
)并定义一个函数,其名称是该标记与 _get_type
。
这里是一个简单的例子:
#define MAKE_FUNC(name, val) int my_ ## name ## _function (void) { return val; }
MAKE_FUNC(magic, 42)
int main(void) {
printf("%d\n", my_magic_function());
return 0;
}
虽然乍一看,该程序似乎没有包含 my_magic_function
的定义,但宏 MAKE_FUNC
实际上会扩展以创建它。 MAKE_FUNC(magic, 42)
的展开很简单
int my_magic_function(void) { return 42; }
关于c - 声明的 C 函数怎么可能没有实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36511831/