storage-class 全局数据说明符静态
storage-class specifier static with global data
我正在阅读 C-Primer Plus 这本书。以下是我希望更好理解的文字 -
文件 - constant.h
/* constant.h -- defines some global constants */
static const double PI = 3.14159;
static const char * MONTHS[12] =
{"January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December"};
文件 - file1.c
/* file1.c -- use global constants defined elsewhere
#include "constant.h"
文件 - file2.c
/* file2.c -- use global constants defined elsewhere
#include "constant.h"
如果不使用关键字static
,包括constant.h在file1.c 和 file2.c 会导致每个文件都有相同标识符的定义声明,这是 C 标准不支持的。通过将每个标识符设为外部静态,您实际上为每个文件提供了一份单独的数据副本。
谁能给我解释一下上面的内容,这样我才能更好地理解?
如果像删除存储说明符静态一样
/* constant.h -- defines some global constants */
const double PI = 3.14159;
const char * MONTHS[12] =
{"January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December"};
然后每个包含 header 的翻译单元将具有 objects PI 和 MONTHS 以及外部链接。
即文件 file1.c
和 file2.c
的翻译单元将具有上述 objects 与外部链接的定义。
现在链接器将不知道 select 的哪个定义,因为它将有两个同名的定义。
当使用存储说明符 static 时,这些具有文件范围的声明在翻译单元之外是不可见的。他们有内部联系。每个翻译单元都会有自己的定义objects。所以定义之间不会有歧义。
我正在阅读 C-Primer Plus 这本书。以下是我希望更好理解的文字 -
文件 - constant.h
/* constant.h -- defines some global constants */
static const double PI = 3.14159;
static const char * MONTHS[12] =
{"January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December"};
文件 - file1.c
/* file1.c -- use global constants defined elsewhere
#include "constant.h"
文件 - file2.c
/* file2.c -- use global constants defined elsewhere
#include "constant.h"
如果不使用关键字static
,包括constant.h在file1.c 和 file2.c 会导致每个文件都有相同标识符的定义声明,这是 C 标准不支持的。通过将每个标识符设为外部静态,您实际上为每个文件提供了一份单独的数据副本。
谁能给我解释一下上面的内容,这样我才能更好地理解?
如果像删除存储说明符静态一样
/* constant.h -- defines some global constants */
const double PI = 3.14159;
const char * MONTHS[12] =
{"January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December"};
然后每个包含 header 的翻译单元将具有 objects PI 和 MONTHS 以及外部链接。
即文件 file1.c
和 file2.c
的翻译单元将具有上述 objects 与外部链接的定义。
现在链接器将不知道 select 的哪个定义,因为它将有两个同名的定义。
当使用存储说明符 static 时,这些具有文件范围的声明在翻译单元之外是不可见的。他们有内部联系。每个翻译单元都会有自己的定义objects。所以定义之间不会有歧义。