头文件中未初始化的全局变量的行为

  • 本文关键字:全局变量 初始化 文件 c
  • 更新时间 :
  • 英文 :


测试.h

#ifndef TEST_H
#define TEST_H
int i;
int i = 1; // why no redefinition error issued?
#endif  /* TEST_H */

测试.c

#include "test.h"
int main() {
  int x;
  int x = i; // obviously, a redefinition
  return 0;
}

我真的很好奇头文件中未初始化的全局变量的行为。据我所知,"int I;"one_answers"int I=1"都是I的有效定义,但在实践中,clang和gcc都不会在这种情况下发出错误。有人能解释一下细节吗?

这是这里解释的暂定定义。

在翻译单元的顶层(也就是说,在预处理器之后有所有#includes的源文件),每个C程序都是一系列声明,它们声明具有外部链接的函数和对象。这些声明被称为外部声明,因为它们出现在任何函数之外。

暂定定义

暂定定义是不带初始值设定项、不带存储类说明符或带静态说明符的外部声明。

暂定定义是一种声明,可以作为定义,也可以不作为定义。如果在同一翻译单元中更早或更晚发现了一个实际的外部定义,那么这个暂定定义只是一个声明。

int i1 = 1;     // definition, external linkage
int i1;         // tentative definition, acts as declaration because i1 is defined
extern int i1;  // declaration, refers to the earlier definition
extern int i2 = 3; // definition, external linkage
int i2;            // tentative definition, acts as declaration because i2 is defined
extern int i2;     // declaration, refers to the external linkage definition

如果在同一转换单元中没有定义,则该暂定定义充当初始化器= 0(或者,对于数组类型,= {0})的实际定义。

int i3;        // tentative definition, external linkage
int i3;        // tentative definition, external linkage
extern int i3; // declaration, external linkage
// in this translation unit, i3 is defined as if by "int i3 = 0;"

最新更新