1

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

.c文件中:

int my_global_var;

// main()....

.h文件中:

extern int my_global_var;

因此,任何人都将包含我的.h文件将能够引用my_global_varextern编辑的文件。

而且我还阅读了这也是函数所必需的,但我使用的是gcc4.x,我没有extern.h 文件中的函数,其他程序可以成功link

所以,问题是...

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

4

2 回答 2

2

从标准,6.2.2

5如果函数标识符的声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符 extern 声明的一样。如果对象标识符的声明具有文件范围且没有存储类说明符,则其链接是外部的。

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

于 2011-02-23T17:05:20.137 回答
1

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

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

extern int foo;
static const int bar = 42;

和功能之一

extern int spam(void);
static inline int eggs(void) { return 42; }
于 2011-02-23T17:09:09.137 回答