声明与C中的定义

时间:2015-10-16 05:15:18

标签: c language-lawyer

考虑代码:

int main(void)
{
    int a;
}

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

  

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

     

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

     

...

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

4 个答案:

答案 0 :(得分:5)

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

指定 for(int x=0; x< pictureObj.getWidth(); x++) { pixelSource1 = pictureObj.getPixel(x,y); pixelColor = pixelSource1.getColor(); redValue = pixelColor.getRed(); blueValue = pixelColor.getBlue(); greenValue = pixelColor.getGreen(); int nr = 0; int ng = 0; int nb = 0; int tempResult = redValue / 21; switch (tempResult){ case 1 : nr = 255; nb = 127;break; case 2 : nr = 255; nb = 255;break; case 3 : nr = 127; nb = 255;break; case 4 : nb = 255; break; case 5 : ng = 128; nb = 255;break; case 6 : ng = 255; nb = 255;break; case 7 : ng = 255; nb = 128;break; case 8 : ng = 255; break; case 9 : nr = 128; ng = 255;break; case 10 : nr = 255; ng = 255;break; case 11 : nr = 255; ng = 128;break; case 12 : nr = 255;break; default : nr = 255; ng = 255; nb = 255; break;} pixelSource1.setColor(new Color(nr, ng, nb)); } 是定义的文本在其他地方。

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

答案 1 :(得分:2)

  

那么int a;是声明吗?

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

答案 2 :(得分:2)

for(vector<string>::iterator it = tokens.begin(); it != tokens.end(); ++it)

这是一个定义 为变量int a;

分配了一个内存
a

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

定义变量后,您可以使用完全合法的地址。

答案 3 :(得分:0)

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

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

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

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