命名空间

符号(函数和类型)和文件的持续且完整的命名空间对于两个关键原因至关重要

  1. 建立一种约定,这意味着开发者只需要学习更少的符号名称就可以使用该库——他们可以可靠地推断这些名称。

  2. 确保两个项目的符号在包含在同一文件中时不会冲突。

第二点很重要——想象一下,如果每个项目都导出一个名为 create_object() 的函数会发生什么。定义它们的头文件无法包含在同一个文件中,即使克服了这个问题,程序员也无法知道每个函数来自哪个项目。命名空间通过为项目中的每个符号和文件名使用唯一的、一致的前缀,将符号分组到它们所属的项目中,并将它们与其他项目分隔开,从而消除了这些问题。

以下约定应用于所有符号的命名空间。它们被用于所有基于 GLib 的项目中,因此许多开发者应该都熟悉它们

  • 函数应使用 小写字母加下划线(也称为蛇形命名法)。

  • 结构体、类型和对象应使用 驼峰命名法不含下划线

  • 宏和常量应使用 大写字母加下划线

  • 所有符号都应以命名空间的简短版本(2-4 个字符)作为前缀。这只是为了方便键入而缩短,但仍然应保持唯一性。

  • 类中的所有方法也应以类名作为前缀。

此外,公共头文件应从一个子目录中包含,从而有效地命名空间化头文件。例如,不要使用 #include <abc.h>,项目应允许其用户使用 #include <namespace/abc.h>

有些项目在其子目录中命名空间化它们的头文件——例如,使用 #include <namespace/ns-abc.h> 而不是 #include <namespace/abc.h>。这是一种冗余的做法,但无害。

例如,对于一个名为“Walbottle”的项目,可以选择简短的命名空间“Wbl”。如果它有一个“schema”类和一个“writer”类,它将安装头文件

  • $(includedir)/walbottle-$API_MAJOR/walbottle/schema.h

  • $(includedir)/walbottle-$API_MAJOR/walbottle/writer.h

(上面使用 $API_MAJOR 是为了实现并行安装性)

对于 schema 类,将导出以下符号(除其他外),遵循 GObject 约定

  • WblSchema 结构体

  • WblSchemaClass 结构体

  • WBL_TYPE_SCHEMA

  • WBL_IS_SCHEMA

  • wbl_schema_get_type 函数

  • wbl_schema_new 函数

  • wbl_schema_load_from_data 函数