【问题标题】:Extern for variables in C, worthless? [duplicate]Extern 用于 C 中的变量,一文不值? [复制]
【发布时间】:2021-01-26 16:48:15
【问题描述】:

我知道编译器默认会向函数添加 extern。但它是否对变量做到这一点?我可以根据需要多次执行 int foo 而不会出现编译器错误,那么 extern int foo 有什么意义呢? int foo 也会是全局的吗?

【问题讨论】:

  • extern 不是“全局”的意思,它表示函数或变量是在另一个编译模块中定义的,如果两者链接在一起,则可以被当前模块使用。
  • 你读过C11标准中的6.9.2 External object definitions吗?
  • 我以为您必须购买 C 标准的副本,无论是 C89/C99/C11 并且无法在线获得?
  • @vingarr stackoverflow.com/questions/81656/…,更具体地说是C11
  • 请注意,对于 GCC 10 及更高版本,编译器默认使用-fno-common(而不是之前的-fcommon)。这意味着如果您在没有extern 前缀的标题中散布全局变量,您的软件将不会在默认编译标志下与 GCC 10 链接。该标准不允许这样做——它确实承认这是一个常见的扩展。让您的生活更简单——不要将变量定义写入没有extern 前缀的头文件。

标签: c function variables


【解决方案1】:

extern int foo; 表示在某个地方有一个名为int 的int 类型的变量,可能在其他编译单元中。当多个翻译单元应该能够直接访问同一个变量时,您需要 extern 关键字。

在这种情况下,访问变量 foo 的每个翻译单元都需要在某处至少有一个 extern int foo;,可能在每个需要访问 foo 的翻译单元中包含的标头内。

在一个且只有一个翻译单元中,需要有一个int foo=0;(你可以用任何你喜欢的替换0),没有extern。变量foo“属于”这个翻译单元。

如果可以,请避免使用全局变量。通过函数访问它们。

【讨论】:

  • 但是如果我可以或应该只使用一次 int foo,为什么编译器不关心我是否多次使用?
  • @vingarr compiler 不在乎,但 linker 会。试试看
  • 或者带有初始化器 (extern int foo = 0;) 的显式 extern 声明可以代替隐式 extern 声明。
  • @vingarr,区别在于定义和单纯的声明。每个外部对象必须只有一个定义,但可以有多个声明。
猜你喜欢
  • 2016-11-03
  • 2017-05-02
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
相关资源
最近更新 更多