带函数名的extern关键字

时间:2011-02-23 16:51:11

标签: c linker extern non-static

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

.c文件中:

int my_global_var;

// main()....

.h文件中:

extern int my_global_var;

因此,任何人都会在我的.h文件中添加my_global_var已经extern编辑的内容。

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

所以,问题是......

非静态函数链接的行为是默认的,还是I link非静态函数要遵守 标准 ?? < / p>

2 个答案:

答案 0 :(得分:2)

从标准6.2.2

  

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

意思是,默认情况下它是外部的。

答案 1 :(得分:1)

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

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

之一
extern int foo;
static const int bar = 42;

并作为

之一
extern int spam(void);
static inline int eggs(void) { return 42; }
相关问题