C extern变量访问

时间:2012-03-28 02:50:33

标签: c extern

我有一个头文件,其中声明了一个外部变量。

所以在这个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文件,以获得整洁和清晰。

3 个答案:

答案 0 :(得分:5)

该变量应仅在一个源代码文件中声明。 (示例中的文件b.c)。

通过在头文件中声明它extern,甚至在多个.c文件的顶部,你基本上声明“变量不在这里,它的外部。但它确实存在,你会看到它。“

变量应该只存在于一个文件中。

如果您尝试在多个源文件中“生效”(例如,通过在b.cc.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文件中使用。