考虑代码:
int main(void)
{
int a;
}
据我所知,int a;
是一个定义,因为它会导致存储被保留。引用C标准(N1570委员会草案 - 2011年4月12日):
6.7 / 5语义 声明指定一组标识符的解释和属性。标识符的定义是该标识符的声明:
- 对于一个对象,导致为该对象保留存储;
...
问题在于:编译器可能会优化存储,因为我们没有使用变量。那么int a;
是宣言吗?如果我们在printf("%p", &a)
中执行main(void)
会怎样 - 当然编译器必须分配存储,因此声明/定义的概念取决于您以后是否使用标识符或不?
答案 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;}