我有一个看起来像
的头文件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;
答案 0 :(得分:2)
这是因为你在全局范围内定义TOS
,需要你定义TOS
的类型(它是一个声明),如果没有给出类型,默认情况下它是{{ 1}}。
这将导致int
,
conflicting type error
答案 1 :(得分:2)
在头文件中转发变量的正确方法是
extern int TOS;
没有extern
否则会导致TOS
分配在多个编译单元(.o文件)中。
然后,您将在一个.c文件中定义为
int TOS;
这将为它保留空间,因为它是全局范围内的变量,它也会将其初始化为0
。如果要使此初始化显式化,或者您希望它与0
之外的其他值,则初始化的正确语法(而不是赋值)是
int TOS = 54;
Modern C不允许您似乎从某处继承的语法,即隐式类型为int
的全局变量的定义。
答案 2 :(得分:0)
TOS=0
不是赋值,它是带初始化器的声明(即:定义)。 int TOS;
是一个具有外部联系的暂定定义。当链接器将多个转换单元链接在一起时,它会折叠相应的对象(=变量的内存)。如其他地方所述,默认类型int
是标准的后续版本中没有的C89功能。