怀疑与extern关键字使用有关

Jay*_*Jay 1 c extern

AFAIK,extern关键字应该用于声明,并且没有值可以与使用extern关键字声明的变量相关联.但是假设我写了一个类似的声明

extern int i = 10;
Run Code Online (Sandbox Code Playgroud)

编译器是否应标记相同的错误?我看到一些编译器容忍并忽略了这一点?为什么会这样?"C"标准对此有何评价?

编辑:@All,谢谢你的回答.我仍有疑问.假设我有这个变量的定义而没有另一个文件中的extern链接说ac和我在bc中添加这个语句仍然可以让编译器不标记错误吗?它是否会被重新定义?

Dig*_*oss 5

这是有效的语法,在C99标准中甚至有一个基本相同的例子.(见§6.9.2-4.)

确实,这些例子不是规范性的,但我认为这是合法的语法.编译器通常会输出一个警告,因为它并没有真正完成任何事情.

4例1

int i1 = 1;             // definition, external linkage
static int i2 = 2;      // definition, internal linkage
extern int i3 = 3;      // definition, external linkage
int i4;                 // tentative definition, external linkage
static int i5;          // tentative definition, internal linkage
int i1;                 // valid tentative definition, refers to previous
int i2;                 // 6.2.2 renders undefined, linkage disagreement
int i3;                 // valid tentative definition, refers to previous
int i4;                 // valid tentative definition, refers to previous
int i5;                 // 6.2.2 renders undefined, linkage disagreement
extern int i1;          // refers to previous, whose linkage is external
extern int i2;          // refers to previous, whose linkage is internal
extern int i3;          // refers to previous, whose linkage is external
extern int i4;          // refers to previous, whose linkage is external
extern int i5;          // refers to previous, whose linkage is internal
Run Code Online (Sandbox Code Playgroud)