据我所知,一个全局变量在 C 中可能有一到两个不同的存储类,并且相应地可以用两个不同的关键字给出声明
extern int foo; //default
static int bar;
静态变量只在声明的模块内可见,不能导出。在 extern 声明的情况下,变量位于所有链接模块的公共(public)命名空间中,除非被静态变量遮蔽。
虽然静态变量必须在它们的模块中定义,但外部变量可以在其他地方定义。如果曾经使用过,则必须对其进行定义。
我的编译器 (GCC) 接受
static int bar = 5;
但在
extern int foo = 4;
似乎期望外部变量永远不会用关键字“extern”定义。这导致了以下问题:
上面例子中的对象'foo'在定义它的模块中有什么样的存储类?
最佳答案
IIRC,extern
更像是在提示编译器它不必为值分配存储空间。链接器应该在另一个编译单元中找到该值。通常在头文件中使用 extern
来表示某人已经定义了与名称关联的存储。值的定义不包括 extern
关键字,因为编译器必须在包含该定义的编译单元中为该值分配存储空间。
参见 extern storage class specifier了解更多详情。
关于c - C 中的外部声明和定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5634523/