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