C语言中的变量声明和作用域

C语言中的变量声明和作用域,c,C,下面是一段代码片段 int var1; extern int var2; 这是一个选择题。 答案是,第一条语句声明并定义var1,但第二条语句只声明var2。 但我认为应该是“两个语句都只声明变量,不定义它们。” 哪一个是正确的?这可能会有所帮助 变量的声明用于通知编译器 以下信息:变量的名称、它所持有的值的类型 以及初始值(如果需要)。i、 例如,声明给出了细节 关于变量的属性。鉴于,变量的定义 表示变量的存储位置。i、 例如,变量的内存为 在变量定义期间分配 在C语言中,变量的定义和声明发

下面是一段代码片段

int var1;
extern int var2;
这是一个选择题。 答案是,第一条语句声明并定义var1,但第二条语句只声明var2。 但我认为应该是“两个语句都只声明变量,不定义它们。” 哪一个是正确的?

这可能会有所帮助

变量的声明用于通知编译器 以下信息:变量的名称、它所持有的值的类型 以及初始值(如果需要)。i、 例如,声明给出了细节 关于变量的属性。鉴于,变量的定义 表示变量的存储位置。i、 例如,变量的内存为 在变量定义期间分配

在C语言中,变量的定义和声明发生在 同时。i、 e.声明和声明之间没有区别 定义。例如,考虑下面的声明

int a;
在此,变量名a和数据类型等信息: int,它被发送到将存储在数据中的编译器 结构称为符号表。除此之外,还有一个大小为2的内存 将分配字节(取决于编译器的类型)

假设,如果我们只想声明变量而不想定义它 i、 我们不想分配内存,那么下面的声明 可以使用

extern int a;
在本例中,仅发送和发送有关变量的信息 没有进行内存分配。上面的信息告诉编译器 变量a现在声明,而它的内存将 稍后在同一文件或不同文件中定义

这可能会有帮助

变量的声明用于通知编译器 以下信息:变量的名称、它所持有的值的类型 以及初始值(如果需要)。i、 例如,声明给出了细节 关于变量的属性。鉴于,变量的定义 表示变量的存储位置。i、 例如,变量的内存为 在变量定义期间分配

在C语言中,变量的定义和声明发生在 同时。i、 e.声明和声明之间没有区别 定义。例如,考虑下面的声明

int a;
在此,变量名a和数据类型等信息: int,它被发送到将存储在数据中的编译器 结构称为符号表。除此之外,还有一个大小为2的内存 将分配字节(取决于编译器的类型)

假设,如果我们只想声明变量而不想定义它 i、 我们不想分配内存,那么下面的声明 可以使用

extern int a;
在本例中,仅发送和发送有关变量的信息 没有进行内存分配。上面的信息告诉编译器 变量a现在声明,而它的内存将 稍后在同一文件或不同文件中定义


实际上,
extern
关键字扩展了C变量和C函数的可见性

声明变量还是定义变量?

变量/函数的声明只是声明变量/函数存在于程序中的某个地方,但没有为它们分配内存

片段1:

extern int var;
int main(void) 
{ 
    var = 10;
    return 0; 
}
代码段1在编译时引发错误。因为var是声明的,但没有在任何地方定义。本质上,var没有分配任何内存。程序试图将一个根本不存在的变量的值改为10

片段2:

#include "somefile.h" 
extern int var; 
int main(void) 
{ 
   var = 10; 
   return 0; 
} 

假设“somefile.h”具有变量的定义,代码片段2将被成功编译。

实际上,
extern
关键字扩展了C变量和C函数的可见性

声明变量还是定义变量?

变量/函数的声明只是声明变量/函数存在于程序中的某个地方,但没有为它们分配内存

片段1:

extern int var;
int main(void) 
{ 
    var = 10;
    return 0; 
}
代码段1在编译时引发错误。因为var是声明的,但没有在任何地方定义。本质上,var没有分配任何内存。程序试图将一个根本不存在的变量的值改为10

片段2:

#include "somefile.h" 
extern int var; 
int main(void) 
{ 
   var = 10; 
   return 0; 
} 

假设“somefile.h”具有变量的定义,代码片段2将被成功编译。

答案取决于几个因素

如果这些声明

int var1;
extern int var2;
如果是块范围声明,那么第一个声明也是一个定义,第二个声明只是一个没有定义的声明。变量
var1
未初始化,因为它的值不确定

如果这些声明是文件范围的声明,那么第一个声明是否是定义取决于该声明是否具有外部定义

如果该声明没有外部定义,则此名为暂定定义的声明是一个定义,且其隐式初始值设定项等于0

至于第二个声明,它是否是定义取决于是否有外部定义。如果没有外部定义,则链接器可以创建定义或发出错误


在C语言中,带有文件作用域的声明如果有初始值设定项,或者是没有外部定义的暂定定义,那么它也是一个定义。

答案取决于几个因素

如果这些声明

int var1;
extern int var2;
如果是块范围声明,那么第一个声明也是一个定义,第二个声明只是一个没有定义的声明。变量
var1
未初始化,因为它的值不确定

如果这些声明是文件作用域的声明,那么第一个声明是否是定义将被忽略