标头可用于声明全局使用的只读资源,例如字符串表。
在单独的标头中声明这些标头,该标头将包含在任何要使用它们的文件中(“翻译单元”)。使用相同的标头声明一个相关的枚举来标识所有字符串资源很方便:
resources.h:
#ifndef RESOURCES_H #define RESOURCES_H typedef enum { /* Define a type describing the possible valid resource IDs. */ RESOURCE_UNDEFINED = -1, /* To be used to initialise any EnumResourceID typed variable to be marked as "not in use", "not in list", "undefined", wtf. Will say un-initialised on application level, not on language level. Initialised uninitialised, so to say ;-) Its like NULL for pointers ;-)*/ RESOURCE_UNKNOWN = 0, /* To be used if the application uses some resource ID, for which we do not have a table entry defined, a fall back in case we _need_ to display something, but do not find anything appropriate. */ /* The following identify the resources we have defined: */ RESOURCE_OK, RESOURCE_CANCEL, RESOURCE_ABORT, /* Insert more here. */ RESOURCE_MAX /* The maximum number of resources defined. */ } EnumResourceID; extern const char * const resources[RESOURCE_MAX]; /* Declare, promise to anybody who includes this, that at linkage-time this symbol will be around. The 1st const guarantees the strings will not change, the 2nd const guarantees the string-table entries will never suddenly point somewhere else as set during initialisation. */ #endif
为了实际定义资源,创建了一个相关的.c文件,这是另一个翻译单元,其中包含相关标头(.h)文件中声明的内容的实际实例:
resources.c:
#include "resources.h" /* To make sure clashes between declaration and definition are recognised by the compiler include the declaring header into the implementing, defining translation unit (.c file). /* Define the resources. Keep the promise made in resources.h. */ const char * const resources[RESOURCE_MAX] = { "<unknown>", "OK", "Cancel", "Abort" };
使用此程序的程序可能如下所示:
main.c:
#include <stdlib.h> /* for EXIT_SUCCESS */ #include <stdio.h> #include "resources.h" int main(void) { EnumResourceID resource_id = RESOURCE_UNDEFINED; while ((++resource_id) < RESOURCE_MAX) { printf("resource ID: %d, resource: '%s'\n", resource_id, resources[resource_id]); } return EXIT_SUCCESS; }
使用GCC编译上面的三个文件,并将其链接为程序文件main,例如,使用以下命令:
gcc -Wall -Wextra -pedantic -Wconversion -g main.cresources.c -o main
(使用它们-Wall -Wextra -pedantic -Wconversion可以使编译器真正变得挑剔,因此在将代码发布到SO之前,您不会错过任何东西,可以说是个不错的选择,甚至值得将其部署到生产环境中)
运行创建的程序:
$ ./main
得到:
resource ID: 0, resource: '<unknown>' resource ID: 1, resource: 'OK' resource ID: 2, resource: 'Cancel' resource ID: 3, resource: 'Abort'