下面是一个代码段,
int var1;
extern int var2;
这是一个多重选择。 答案是,第一条语句声明并定义了var1,而第二条语句仅声明了var2。 但是我认为应该是“两个语句都只声明变量,没有定义变量”。 哪个是正确的?
答案 0 :(得分:6)
这可能会有所帮助。 source
声明变量是为了通知编译器 以下信息:变量的名称,它包含的值的类型 以及初始值(如果需要)。即声明提供详细信息 关于变量的属性。鉴于变量的定义 说出变量的存储位置。即该变量的内存为 在定义变量期间分配。
在C语言中,变量的定义和声明发生在 同时。即声明和之间没有区别 定义。例如,考虑以下声明
int a;
在这里,诸如变量名:a和数据类型的信息: int,将其发送到编译器并将其存储在数据中 结构称为符号表。伴随着这个,大小为2的内存 字节(取决于编译器的类型)将被分配。
假设,如果我们只想声明变量而不是定义变量 即我们不想分配内存,那么下面的声明 可以使用
extern int a;
在此示例中,仅发送有关变量的信息,并且 没有完成内存分配。以上信息告诉编译器 现在声明了变量a,而对其的内存将是 稍后在同一文件或不同文件中定义。
答案 1 :(得分:2)
答案取决于几个因素。
如果有这些声明
int var1;
extern int var2;
是块作用域声明,那么第一个声明也是定义,第二个声明只是没有定义的声明。变量var1
尚未初始化,因为它具有不确定的值。
如果这些声明是文件范围的声明,则通过该声明是否具有外部定义来定义第一个声明是否是定义。
如果该声明没有外部定义,则称为暂定定义的该声明是一个定义,并且具有等于0的隐式初始化程序。
对于第二个声明,然后再次声明是否是一个定义取决于是否存在外部定义。如果没有外部定义,则链接器可以创建定义或发出错误。
在C语言中,具有文件作用域的声明也是一个定义,当它具有初始化程序或没有外部定义的临时定义时。
答案 2 :(得分:1)
实际上,extern
关键字扩展了C变量和C函数的可见性。
是声明还是定义变量?
声明变量/函数仅声明变量/函数存在于程序中的某个位置,但未为它们分配内存。
代码段1:
extern int var;
int main(void)
{
var = 10;
return 0;
}
片段1在编译中引发错误。因为var是在任何地方声明但未定义的。本质上,该变量没有分配任何内存。而且程序正在尝试将根本不存在的变量的值更改为10。
代码段2:
#include "somefile.h"
extern int var;
int main(void)
{
var = 10;
return 0;
}
假设“ somefile.h”具有var的定义。片段2将成功编译。