0

我理解术语声明和定义如下。

声明:这只是提示编译器在代码中存在指定“名称”“类型”的变量。以便它可以在以后的时间点定义/分配

定义:这是通过分配合适的内存空间来创建类型实例的过程。

int var; //Declaration and Definition-Agreed!!!
extern int var; //Declaration only ?
static int var; //Declaration only ?

我的头脑拒绝同意第二个和第三个作为声明的声明。因为在我看到的许多参考资料中,“外部和静态变量在内存分配时自动初始化为零”。正如您在以下代码中看到的那样。

#include <stdio.h>
int main()
{
   static int i;
   printf("%d\n",i);
   return 0;
}

输出为 0。所以这里看起来像静态 int i;是声明、定义和自动初始化语句。因此,请为此添加您的理由

4

3 回答 3

4

具有静态存储持续时间的对象在 C 中初始化为零。

static int a; // initialized by zero
int b;        // file-scope, static storage duration, initialized by zero

int main(void)
{
     int c;        // automatic storage duration, indeterminate value
     static int d; // initialized by zero
}

a,cd是对象的声明和定义。

bb是声明和定义,因为在翻译单元结束之前没有其他文件范围出现。在翻译单元结束之前,声明是一个暂定定义。

于 2012-10-08T19:01:38.820 回答
1

刚刚做了一个实验,得到了澄清。

static int i; //Declaration,Definition and Auto initialized as zero.
extern int i; //Declaration only. Will throw an error if not externally defined. 
int i; //This when declared outside any code block will be extern by default and initialised to zero
于 2012-10-08T19:13:32.700 回答
0

我希望这个例子可以消除你对 extern 的疑惑:

#include<stdio.h>
extern int foo;
int main(){
foo=1;
return 0;
}

由于尝试将值分配给尚未分配的位置/内存,此代码会给您一个错误。现在考虑这段代码:

#include<stdio.h>
extern int foo = 10;
int main(){
foo=11;
return 0;
}

这段代码可以正确编译,因为 C 在其中表现出某种奇怪的行为。

于 2012-10-08T19:09:49.193 回答