C语言中的变量声明和范围

时间:2019-11-22 12:23:00

标签: c

下面是一个代码段,

int var1;
extern int var2;

这是一个多重选择。 答案是,第一条语句声明并定义了var1,而第二条语句仅声明了var2。 但是我认为应该是“两个语句都只声明变量,没有定义变量”。 哪个是正确的?

3 个答案:

答案 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将成功编译。