我有一个头文件,让我们称之为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类型。但是,我假设变量的定义将从头文件中继承。我哪里错了?
答案 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您可以在此问题上找到更多信息。