【发布时间】:2015-10-16 05:15:18
【问题描述】:
考虑代码:
int main(void)
{
int a;
}
据我所知,int a; 是一个定义,因为它会导致存储空间被保留。引用 C 标准(N1570 委员会草案 — 2011 年 4 月 12 日):
6.7/5 语义 声明指定一组标识符的解释和属性。标识符的定义是该标识符的声明:
——对于一个对象,导致为该对象保留存储空间;
...
问题来了:编译器可能会优化存储,因为我们没有使用变量。那么int a; 是一个声明吗?如果我们在main(void) 中执行printf("%p", &a) 会怎样——当然现在编译器必须分配存储空间,那么声明/定义的概念是否取决于您以后是否使用标识符?
【问题讨论】:
-
一个定义永远是一个定义,即使没有被使用(即使编译器实际上并没有发出代码或为它保留空间)。
-
@JoachimPileborg 标准有点模棱两可,它肯定说:导致存储被保留...。然后在整个标准中,该术语可以互换使用,例如他们称
int* p;为声明。整个讨论开始here -
@RahulTripathi 不,这不是骗子,我想要一个符合标准的答案,这也是语言律师标签的原因。
标签: c language-lawyer