c-带有全局数据的静态存储类说明符



我正在读C-Primer Plus这本书。以下是我想更好地理解的文本-

文件-常量.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,包括file1.c文件2.constant.h,将导致每个文件都有相同标识符的定义声明,这是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"};

则包括报头的每个翻译单元将具有具有外部链接的对象PI和MONTHS。

也就是说,文件file1.cfile2.c的翻译单元将具有具有具有外部链接的上述对象的定义。

现在链接器将不知道要选择哪个定义,因为它将有两个同名的定义。

当使用存储说明符static时,这些带有文件作用域的声明在转换单元之外不可见。它们有内在的联系。每个翻译单元都有自己的对象定义。因此,定义之间不会有歧义。

最新更新