下面的代码片段中缺少函数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编程不了解什么呢?
发布于 2016-04-09 02:28:10
实现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。在扩展的某个时候,我猜想标记粘贴 ( ##预处理器指令)将被用来接收传递给宏的一个令牌(此处为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; }发布于 2016-04-09 02:15:12
函数glade_project_get_type()被编译成一个库,例如libglade。这个库的原始源代码并不包含确切的定义,因为这个函数的源代码是从模板生成的,模板可以查看这里。
您使用的标头只描述可用的函数。头文件很少包含C中的实际源代码,它们通常只包含函数和类型定义。编译器使用标头中的信息来知道函数的返回类型和参数类型,或者知道结构或联合中的成员。实际上,确保正在使用的函数具有定义是链接器的工作。链接器将将您的源代码与预编译的libglade库链接起来,并将所有内容连接起来。
https://stackoverflow.com/questions/36511831
复制相似问题