【问题标题】:is extern the only way to write a declaration that is not also a definition?extern 是编写不是定义的声明的唯一方法吗?
【发布时间】:2016-03-04 20:39:54
【问题描述】:

断定变量声明的唯一类型是“外部声明”是否合理?

众所周知,以下代码 define(不是 declarex,因为它为变量 x 分配内存(KR 第 4 章)。但通常情况下,我们通常只会说我们正在声明 x(但不初始化它)。

int x; // <-- definition NOT declaration

我能找到的唯一声明示例是使用关键字extern

extern int x;
extern int a[];

除了extern声明还有其他变量声明的情况吗?

【问题讨论】:

  • 我不确定我是否完全理解您的问题。但也有一个static 声明。
  • int x; 是一个声明。 (所有定义都是声明)。也许您的意思是问“extern 是编写不是定义的声明的唯一方法吗?”之类的。
  • @M.M 是的,这正是我的 Q - 让我根据你的 cmmt 改写标题,谢谢
  • Funktions 可以用内部链接声明(使用 static 关键字)。您不必使用 external 关键字,但函数声明仍将具有外部链接。您可以声明具有局部作用域的函数(在块内),但仍然是外部链接。
  • @PeterA.Schneider 问题是关于变量的 - 但感谢有关函数的信息

标签: c


【解决方案1】:

定义是一个带有存储的声明。来自标准:

6.7 声明 3/ 声明指定一组标识符的解释和属性。 标识符的定义是该标识符的声明 那:

——对于一个对象,导致为该对象保留存储空间;

——对于函数,包括函数体;119)

——对于枚举常量,是(唯一的)声明 标识符;

——对于 typedef 名称,是第一个(或唯一一个) 标识符的声明。

那么函数原型就是一个声明,如果用于前向声明,它可能不符合extern。一个

有关更多详细信息,请阅读标准,第 6.7 节。

【讨论】:

  • 我的问题是关于变量声明的。
  • 很抱歉,它没有回答问题。问题是Is 'extern' declaration the only way to declare (instead of define) a variable?
  • 那么您同意“外部声明”是声明变量的唯一方法的说法吗?
  • 是的,但我不会那样说,我宁愿“extern”是唯一声明不定义的方式。
  • 函数形式参数怎么样——它们没有在函数定义中定义——只声明了。
【解决方案2】:

extern 主要用于函数存在于另一个文件(源代码或对象库)中时的函数。

auto 用于堆栈变量,但由于它是默认设置,因此很少有人明确使用它。

static 用于静态变量,即使在函数退出时也会保留。 auto 变量在函数退出时会丢失,因此静态变量通常用于总计数、用户设置、状态设置,这些变量可能会发生变化,但会在程序运行的整个过程中使用。

【讨论】:

  • extern 用于几乎任何全局变量。示例:errno,在 &lt;errno.h&gt; 中声明 extern
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2023-01-30
  • 2023-04-09
  • 2010-12-30
  • 2022-11-28
  • 2015-11-01
相关资源
最近更新 更多