【问题标题】:extern keyword with function names带有函数名称的 extern 关键字
【发布时间】:2011-02-23 16:51:10
【问题描述】:

我知道 static 关键字使 C 函数/变量是文件范围的。 而且我已经读过,如果我想创建一个变量全局范围(由多个文件访问),我应该这样做:

.c 文件中:

int my_global_var;

// main()....

.h 文件中:

extern int my_global_var;

因此,任何人将包含我的.h 文件将能够引用my_global_var,它已经是externed。

我还读到这也是函数所必需的,但我使用的是gcc 4.x,我没有extern .h 文件中的函数,其他程序可以成功link 它。

所以,问题是……

非静态函数链接的行为是默认的还是我应该extern非静态函数遵守标准??

【问题讨论】:

标签: c linker extern non-static


【解决方案1】:

从标准,6.2.2

5 如果函数标识符的声明没有存储类 说明符,它的联系是确定的 就好像它被声明为 存储类说明符 extern。如果 标识符的声明 一个对象有文件范围并且没有 存储类说明符,它的链接 是外部的。

意思是,默认是extern。

【讨论】:

    【解决方案2】:

    默认情况下,函数和对象声明都是extern。但是,您需要在头文件中的对象声明中添加显式 extern 以避免重新定义:如果没有存储类说明符,任何文件范围的对象声明实际上都称为 暂定定义 并为当前翻译单元中的对象保留存储空间。

    为了保持一致性,我不必要地使用extern,即使是函数声明。在大多数情况下,我将标头中的对象声明为

    extern int foo;
    static const int bar = 42;
    

    并作为其中之一发挥作用

    extern int spam(void);
    static inline int eggs(void) { return 42; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多