存储类和类型的奇怪GCC警告

我有一个看起来像的头文件

header.h

int TOS; 

该文件仅包含在一个代码文件中

code.c

 #include "header.h" TOS=0; 

编译code.c时,GCC会发出警告

code.c:3:1:警告:数据定义没有类型或存储类[默认启用] code.c:3:1:警告:在’TOS’声明中默认为’int’类型[默认启用]

我不明白这个警告的原因。 它不等同于在code.c中声明和定义TOS吗? 即

code.c

 int TOS; TOS=0; 

这是因为你在全局范围内定义了TOS ,它需要你定义TOS的类型(它是一个声明),如果没有给出类型,默认情况下它是int

这将导致conflicting type error

 char x; x = 0; 

在头文件中转发变量的正确方法是

 extern int TOS; 

如果没有extern这可能会导致在几个编译单元(.o文件)中分配TOS

然后,您将在一个.c文件中给出一个定义

 int TOS; 

这将为它保留空间,因为它是全局范围内的变量,所以它也会将其初始化为0 。 如果要使此初始化显式化,或者如果希望它为0以外的其他值,则初始化(而不是赋值 )的正确语法是

 int TOS = 54; 

Modern C不允许您似乎从某处inheritance的语法,即隐式类型为int的全局变量的定义。

TOS=0不是赋值,它是带初始化器的声明(即:定义)。 int TOS; 是一个外部联系的暂定定义。 当链接器将多个转换单元链接在一起时,它会折叠相应的对象(=变量的内存)。 如其他地方所述,默认类型的int是标准的后续版本中不存在的C89特征。