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

时间:2011-10-09 11:47:40

标签: c gcc gcc-warning

我有一个看起来像

的头文件

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;

3 个答案:

答案 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功能。