0

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

头文件.h

int TOS;

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

代码.c

#include "header.h"
TOS=0;

编译 code.c 时 GCC 发出警告

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

我不明白这个警告的原因。不就相当于在code.c中声明和定义TOS吗?IE

代码.c

int TOS;
TOS=0;
4

3 回答 3

2

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

这将导致conflicting type error,

char x;
x = 0;
于 2011-10-09T11:54:23.010 回答
2

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

extern int TOS;

没有externthis 可能会导致TOS在多个编译单元(.o 文件)中分配。

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

int TOS;

然后,这将为它保留空间,并且由于它是全局范围内的变量,因此它也会将其初始化为0. 如果您想使这个初始化显式或者如果您希望它是另一个值而不是,则初始化(而不是赋值0的正确语法是

int TOS = 54;

现代 C 不允许您似乎从某处继承的语法,即具有隐式类型的全局变量的定义int

于 2011-10-09T12:55:51.920 回答
0

TOS=0不是赋值,而是带有初始化器的声明(即:定义)。int TOS;是一个带有外部链接的暂定定义。当链接器将几个翻译单元链接在一起时,它会折叠相应的对象(=变量的内存)。正如其他地方所说,默认类型int是标准的后续版本中缺少的 C89 功能。

于 2011-10-09T15:23:12.590 回答