我有一个头文件,其中声明了一个外部变量。
所以在这个a.h文件中它看起来像这样
extern uint16_t externVariable;
所以我有2个.c文件b和c,我想在其中访问a.h文件中的extern变量。在b和c .c文件中,我已经包含了a.h文件
当我没有在b中声明变量但在c中声明(没有单词extern)时,这就像
uint16_t externVariable;
工作正常。但是当它在b和c中都有一些编译错误。有什么方法可以解决这个问题吗?
这样做的原因是因为我在.c文件中有代码,我想将代码分成2个不同的.c文件,以获得整洁和清晰。
答案 0 :(得分:5)
该变量应仅在一个源代码文件中声明。 (示例中的文件b.c
)。
通过在头文件中声明它extern
,甚至在多个.c
文件的顶部,你基本上声明“变量不在这里,它的外部。但它确实存在,你会看到它。“
变量应该只存在于一个文件中。
如果您尝试在多个源文件中“生效”(例如,通过在b.c
和c.c
中声明它),您将收到您看到的错误。
答案 1 :(得分:1)
“extern”告诉C编译器这个函数或变量是在其他地方声明的,所以即使没有在头文件中声明它们也可以使用它们,并在.c文件中包含.h。请注意,“extern”表示此变量不是初始声明,初始声明绝不能有extern关键字。
在您的情况下,您在一个文件中声明了一个extern变量而没有添加“static”关键字,因此变量的范围将是整个项目。然后你宣布“uint16_t externVariable;”在2个地方,编制者认为他们都是初始声明都有相同的名字,所以冲突就开始了。
例如,您可以执行以下操作:
示例1:
a.c:uint16_t externVariable;
b.c:extern uint16_t externVariable;
不要担心你的头文件,你可以在a.c和b.c中使用externVariable。
示例2:
a.c:#include“a.h”
b.c:#include“a.h”
a.h:uint16_t externVariable;
这很有效。
示例3:
a.c:extern uint16_t externVariable;
b.c:uint16_t externVariable;
c.c:uint16_t externVariable;
由于您在多个位置声明了externVariable,因此无效。
示例4:
a.c:static uint16_t externVariable;
b.c:static uint16_t externVariable;
这样就行了,因为“static”关键字限制了它们的范围,所以它们不会发生冲突。
示例5:
a.c:static uint16_t externVariable;
b.c:static uint16_t externVariable;
c.c:extern uint16_t externVariable;
这仍然无效,因为“static”关键字限制了它们的范围,并且编译器无法在c.c中找到你声明的externVariable的位置。
您还可以查看TCPL,它提供了关于这些关键字的更大图片,希望这些示例可以提供帮助:)
答案 2 :(得分:0)
extern的想法是让编译器知道这个变量是在差异源文件中分配的,所以不需要在另一个源文件中再次声明它。把它留在一个文件中(我会说a.cpp,因为它在a.h中)并包含a.h,它可以在所有.cpp文件中使用。