1

我正在读《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.cfile2.c中的constant.h将导致每个文件都有相同标识符的定义声明,这是 C 标准不支持的。通过使每个标识符静态外部,您实际上为每个文件提供了数据的单独副本。

有人可以向我解释上述内容,以便我更好地理解吗?

4

1 回答 1

1

如果要删除存储说明符 static 像

/* 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 时,这些具有文件范围的声明在翻译单元之外是不可见的。他们有内在的联系。每个翻译单元都有自己的对象定义。所以定义之间不会有歧义。

于 2020-04-26T14:04:00.440 回答