在c中声明与定义变量

Declaring vs defining variables in c

本问题已经有最佳答案,请猛点这里访问。

据我所知,这是一份声明:

1
int i;

这是一个定义:

1
int i = 10;

也许我错了,我不争辩。

问题是编译器是否为声明的(但未定义的)变量预留了内存?


定义是为变量分配存储的时间。声明并不意味着存储已分配。

声明用于访问在不同源文件或库中定义的函数或变量。定义类型和声明类型不匹配会生成编译器错误。

以下是一些不是定义的声明示例,在C中:

1
2
3
extern char example1;
extern int example2;
void example3(void);

根据C标准(N1256):

6.7 Declarations
...
5 A declaration specifies the interpretation and attributes of a set of identifiers.

A definition of an identifier is a declaration for that identifier that:

— for an object, causes storage to be reserved for that object;

— for a function, includes the function body;101)
— for an enumeration constant or typedef name, is the (only) declaration of the
identifier.


"Does the compiler set aside memory for the declared (but not defined) variables?"

不。编译器只为变量定义分配内存(在定义时),而不是在变量声明上。

您可以使用一个简单的类比来更好地理解逻辑,单个变量允许使用多个声明,但不允许使用多个定义。


Does the compiler set aside memory for the declared (but not defined)
variables?

不,编译器只需要记下这个变量的名称和类型。没有为声明分配内存。

如果使用了i而其他编译单元中没有i的其他定义,则int i;可以作为定义,并为其保留存储空间。(因为存储是为定义保留的)