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;}