c - 声明的 C 函数怎么可能没有实现?

标签 c

我对以下代码片段中缺少函数 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/

相关文章:

c++ - 我需要非常快地计算斯特林的近似值

c - 如何使用sqlite3_config(SQLITE_CONFIG_HEAP...)?

客户端连接失败

c - Mors 字母分割错误

c - 如何替换字符数组中的单个字符?

使用 C 指针和结构的链表程序中的冲突类型错误消息

c - 按照出现的顺序对奇数和偶数进行排序

c - linux 套接字客户端/服务器程序

c - OpenThread - 节点始终分离 - CC2650

更改 Fork() 系统调用