c - C 中的外部声明和定义

标签 c scope storage-class-specifier

据我所知,一个全局变量在 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/

相关文章:

c - 未知的 C 表达式

c - C 中的字符串操作和系统调用

c - C中的_Thread_local存储类说明符?

c - 存储类 : Understanding Static

c - 注册与自动存储类?

java - 什么样的应用程序使用 getopt "return in order"行为?

c - 如何使用 GNU 工具链来学习 C 编程?

python - 函数工厂中变量的范围

c - 函数使用相同的内存进行本地指针初始化?

javascript - JavaScript 中基于范围的变量阴影