存储类和类型的奇怪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特征。