C程序中的共享常量

时间:2017-07-15 02:40:32

标签: c linker constants

我有一个头文件,让我们称之为foo.h.在foo.h中,我有以下代码。

extern const size_t video_column_size;

在另一个文件中,让我们先调用它。我有以下代码。

#include "foo.h"
video_column_size = 4;

我的目标是将此值作为单个常量变量,将在包含foo.h头的所有类之间共享。

当我编译和链接时,我收到以下错误。

warning: data definition has no type or storage class
warning: type defaults to 'int' in declaration of 'video_column_size' [-Wimplicit-int]
conflicting type qualifiers for 'video_column_size'
note: previous declaration of 'video_column_size' was here: 
extern const size_t video_column_size;

根据我的理解,发生这种情况的原因是因为当没有类型声明时,C默认为int类型。但是,我假设变量的定义将从头文件中继承。我哪里错了?

1 个答案:

答案 0 :(得分:1)

嗨,

这是问题所在。在头文件中,您将video_column_size声明为extern变量,该变量未创建变量(与常规const size_t video_column_size不同)。基本上,extern关键字用于解析链接阶段上的符号,它不会分配与符号关联的内存,而只是声明符号存在于其他位置。

所以,我们转移到 first.c ,这就是编译器所在的位置。由于赋值放在任何功能块之外,它假定您正在创建一个新的全局变量并分配它。由于没有明确指定类型,因此它假定在 first.c 中声明的新video_column_size变量属于int类型,并且因为您导出的{{1}并且您的新extern const size_t video_column_size创建了具有相同名称的不同强符号。链接器无法解析这两个强符号,因此您从编译器中获得错误。

希望我能解释这个问题。 Here您可以在此问题上找到更多信息。