适当的外部变量声明和定义

时间:2014-06-02 20:35:48

标签: c extern

在C中定义公开变量的公认标准方法是什么?假设设置如下:

在.h

typedef struct my_struct{
...
} my_struct;

extern my_struct var1;

在.c

my_struct var1;

这是正确的用法还是编译器在这里做了不必要的工作?外界实际上在做什么?我的理解一直是默认情况下一切都已经隐含了extern。

3 个答案:

答案 0 :(得分:2)

  

我的理解一直是默认情况下一切都已经隐含了extern。

但这是真的......

标题中明确extern var1的目的是:

  1. 记录您的意图,var1不是私密的。
  2. 通知编译器include标头使用在其他位置声明的变量的源文件。
  3. <强>建议

    创建getter / setter函数并将var1设为私有(static)。

答案 1 :(得分:2)

当涉及变量和函数时,隐式extern部分之间存在细微差别。

如果你把

void foo(void);
<。>在.h文件中并将.h文件包含在多个.cc文件中,因为该函数未在.h文件中定义,所以没有任何危害。它只是声明了。

如果你放,

int x;

在同一个.h文件中,然后在包含.h文件的每个.c文件中定义x。如果.h文件有:

,你会得到类似的错误
void foo(void){}

因为这是宣言和定义。

要使x之类的变量仅作为声明,您需要添加extern关键字。

答案 2 :(得分:1)

这是完全正确的。您需要在标头中包含extern,以告诉编译器存在var1以及在编译使用它的代码时它的类型是什么。

(我假设您在多个var1文件中使用.c,其中一个正在定义它。如果您只在一个.c中使用它如果在使用变量之前定义变量,则不需要在标题中声明。)