【问题标题】:extern keyword in C rules [duplicate]C规则中的extern关键字[重复]
【发布时间】:2019-01-16 13:44:38
【问题描述】:

为什么下面的代码可以工作 -

extern int i;    
main()
{
   int i = 10;
   printf("%d", i);
}

但这个没有 -

main()
{
   extern int i;
   int i = 10;
   printf("%d", i);
}

【问题讨论】:

  • 第一种情况,有2个i变量,一个是局部的,一个是全局的。您不能在本地范围内使用 extern。重点是:你想实现什么。
  • 错误的思维方式:C 语言是由规范(阅读n1570)定义的,而不是由计算机上特定编译器的行为定义的。害怕undefined behavior
  • 这里的未定义行为在哪里?

标签: c extern


【解决方案1】:

如 cmets 中所述,在第一个片段中有两个不同的变量;范围规则使本地(内部)变量隐藏了外部变量,但仍然有两个。

在第二个片段中,有两次声明相同标识符的诱惑,声明相互冲突。

【讨论】:

  • 除了这个答案,我还想建议阅读这个其他 StackOverflow 问题How do I use extern... 以正确使用它。我做了很多错误修复,其中extern 使用不正确。这是一个严重的“危险”关键字。
【解决方案2】:

因为extern 表示该变量是在别处定义的。您可以在其他地方定义全局范围内的变量(嗯,因为它是全局的,所以它是共享的 :)),但是您不能在其他地方定义局部变量,因为函数体就在这里。如果你能以某种方式在两个文件之间将函数体分成两部分,在一个块中声明这个变量,然后使用extern 在另一个块中引用它,那有点是有道理的......但是这是不可能的,所以函数体内的extern 是没有意义的。

UPD:我没有注意到这两种情况下都有两个变量,抱歉。 @linuxfan 的答案在这种情况下更适用。我将把这个答案留在这里,以防它对任何人都有帮助(作为附加细节)。

【讨论】:

  • 我不想因为别人的评论而受到赞扬。另外:我没有提到extern,因为我想使用一个局部作用域的外部变量;它可以有意义。
  • @linuxfan,如果你愿意,我可以删除更新的那部分。只是个人意见。至于extern,我还是不同意。因为在这种情况下,就好像您正在声明一个局部变量,但使用 extern 关键字。这会引起混乱。
  • 什么都没有问题。但是对于 extern:它不会引起混淆,因为 extern 已经说明并且您可以阅读它。考虑一个静态局部变量——你接受吗?它是一个全球性的,但具有本地范围。为什么是静态是,而外部不是?
  • @linuxfan,因为static 不像extern 那样是全局的。 static 属于该函数,它属于它,没有其他人可以修改它(好吧,除了将引用/指针显式传递给外部世界的情况)。从语义上讲,它不是全局的,它只是持久的。 extern,另一方面是不同的。嗯,这可能是一个感知问题:)
【解决方案3】:

在您的第一个 sn-p 中。您声明全局变量“i”存在,并且已在项目其他位置包含的某个文件中的其他位置声明。

主文件中的其他函数将能够访问该变量。 main 文件中的 main 函数创建了一个同名的局部变量,因此将无法访问全局 'i' 变量。

第二个sn-p有两个错误。 1)您试图声明一个局部外部变量 - 这是无效的。 2) 你试图在同一个作用域中声明同名的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2010-10-25
    相关资源
    最近更新 更多