【问题标题】:static keyword and external variables in CC中的静态关键字和外部变量
【发布时间】:2016-07-14 13:04:32
【问题描述】:

我有以下一段代码,我在代码中需要使用它们的位置之后定义了几个外部(全局)变量。 为此,我使用关键字 extern 来声明它们而不为它们保留存储空间。

int main(int argc,char *argv[])
{

  extern int a;
  extern double b;

  /* ...use the variables somehow... */

{

int a = 10;
static double b = 2.0;

如果我这样做了,编译器会抱怨我将 b 变量定义为静态的(因此具有内部链接),而在我声明它是 extern 之前。 但是,如果我在使用它之前反转顺序并定义它并在 main 中声明它(我知道这是可选的......)一切都很好。

static double b = 2.0;

int main(int argc,char *argv[])
{

  extern int a;
  extern double b;

  /* ...use the variables somehow... */

{

int a = 10;

如果我想在定义之前使用外部私有变量(即具有内部链接)怎么办?是否被禁止?为什么?

【问题讨论】:

  • 这里有一些有用的读物​​stackoverflow.com/questions/2841762/…也许是重复的?
  • 与问题无关,但您的主要签名很奇怪:int main void。不需要void
  • @SurvivalMachine 只是一个错字..已编辑,谢谢。
  • 请投票反对的人提供理由。
  • 只是问external private variable 这有什么意义?如果是外部的,它是如何私有的?

标签: c static global-variables external


【解决方案1】:

extern 关键字告诉编译器我们引用的变量位于不同的翻译单元(基本上是另一个源文件),而static 关键字表示变量(在全局变量的情况下)是当前翻译单元的本地,在其他源文件中看不到,所以两个关键字一起使用是没有意义的。

一旦你在same 文件中将b 声明为全局,它在main 中是可见的,不需要再次声明它,你可以使用它。 另一方面,如果它在不同的翻译单元中声明为全局变量,则extern 关键字变得必要。

【讨论】:

  • 是的,但是如果我想在定义(为其保留存储空间)之前使用它怎么办?它需要是一个共享的全球吗?如果我希望它成为私有全局(具有内部链接)怎么办
  • 全局变量的存储保留在程序的数据段中,在声明它之前不能使用全局变量(extern 除外,但正如我所说,这用于来自不同翻译的变量单位)。
  • 你应该格式化你的答案并在句首使用大写。
  • static 关键字仅使文件范围标识符成为当前翻译单元的本地标识符。 static 对自动变量有完全不同的效果,它将对象的存储持续时间从其定义范围更改为每个执行线程初始化的对象实例到存在的对象的单个实例进程的整个生命周期,在进程启动时进行初始化。
  • @Andrew Henle 你是对的,编辑了帖子以明确说明我只是指全局变量以避免混淆,感谢您的输入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 2011-03-10
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多