繁体   English   中英

外部变量声明和定义

[英]External variable declaration and definition

a)外部变量的定义与局部变量的定义相同,即int i=2; (仅在所有功能之外)。 但是为什么extern int i=2; 太定义了吗? extern不只用于其他文件的变量声明中吗?

b)文件1

  #include<stdio.h>
  int i=3;
  int main()
  {
      printf("%d",i);
      fn();
  }

文件2

  int i;  //  although the declaration should be: extern int i; So, why is this working?
  void fn()
  {
      printf("%d",i);
  }

输出:两种情况下均为3

由于历史原因,确定链接的规则以及何时声明提供定义的规则有些混乱。

对于您的特定示例,在文件范围内

extern int i = 2;

int i = 2;

是等效的外部定义,即,如果提供初始化程序,则extern是可选的。

但是,如果不提供初始化程序,则extern 不是可选的:

int i;

是具有外部链接的暂定定义 ,该定义等于

int i = 0;

如果翻译单元不包含带有显式初始化程序的其他定义。

这不同于

extern int i;

这从来不是一个定义。 如果已经存在另一个可见的相同标识符的声明,则该变量将从中获得其链接; 如果这是第一个声明,则该变量将具有外部链接。

这意味着在您的第二个示例中,file1和file2都提供了i的外部定义,这是未定义的行为,链接器可以自由选择最喜欢的定义(它也可以使恶魔从您的鼻子里飞出来)。 。 C有一个通用扩展名(请参阅C99附件J.5.11和此问题 ),这使这种特殊情况得到了很好的定义。

在C语言中,带有初始化的extern变量会导致分配变量。 该声明将被视为定义声明。 这与extern的更常见用法相反。

C标准说:

6.9.2外部对象定义

.....

如果对象的标识符声明具有文件范围和初始化程序,则该声明是标识符的外部定义。

至于问题的第二部分,文件范围的声明int i具有外部链接。 如果要给它内部链接,则需要将其声明为static int i C标准说:

6.2.2标识符的链接

......

如果对象标识符的声明具有文件范围并且没有存储类说明符,则其链接是外部的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM