使用全域性常量
標頭可用於宣告全域性使用的只讀資源,例如字串表。
在一個單獨的標題中宣告它們,它們被任何想要使用它們的檔案(翻譯單元) 包括在內。使用相同的頭來宣告相關的列舉以識別所有字串資源非常方便:
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.c resources.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'