C中的声明与定义

考虑一下代码:

int main(void) { int a; } 

据我所知, int a; 是一个定义,因为它会导致存储被保留。 引用C标准(N1570委员会草案 – 2011年4月12日):

6.7 / 5语义声明指定了一组标识符的解释和属性。 标识符的定义是该标识符的声明:

– 对于一个对象,导致为该对象保留存储;

问题出在这里:编译器可能会优化存储,因为我们没有使用变量。 然后是int a; 那么宣言呢? 如果我们在main(void)执行printf("%p", &a) ,那么现在编译器必须分配存储,因此声明/定义的概念取决于您以后是否使用标识符?

您从6.7 / 5引用的文本实际上意味着以与您所做的相反的方式进行解释:文本说定义导致存储被分配。

指定int a;的文本int a; 是别的定义。

C是根据抽象机器定义的。 在抽象机器中分配了存储。 是否在PC上分配了任何内存是不相关的。

然后是int a; 那么宣言呢?

是。

实际上, 每个定义也都是一个声明 。 变量只能有一个定义,但可以有多个声明。

 int a; 

这是一个定义为变量a分配了一个内存

 extern int a; 

这是一个声明。 未分配内存,因为它未定义。

一旦定义了变量,您就可以使用完全合法的地址。

声明引入标识符并描述其类型,无论是类型,对象还是函数。 声明是编译器接受对该标识符的引用所需的。 这些是声明:

 extern int bar; extern int g(int, int); 

定义实际上实例化/实现此标识符。 这是链接器将引用链接到这些实体所需的内容。 这些是与上述声明相对应的定义:

 int bar; int g(int lhs, int rhs) {return lhs*rhs;}