我在C中声明了两个同名的全局变量。 它应该给出错误,因为我们不能在同一存储类中声明相同的名称变量。
我已经用C ++检查了它 - 它给出了编译时错误,但不是C.为什么?
以下是代码:
int a;
int a = 25;
int main()
{
return 0;
}
我认为这可能是原因
Declaration and Definition in C
但是在C ++中并非如此。我认为在C ++中,无论变量是在全局范围还是自动范围声明,声明和定义都是同时发生的。
任何人都可以更多地了解它。
现在当我定义变量两次给它两次值时,它给了我错误 (而不是一个声明和一个定义)。
int a;
int a;
int a;
int a = 25;
int main()
{
return 0;
}
答案 0 :(得分:8)
在C中,多个全局变量被“合并”为一个。所以你确实只有一个全局变量,多次声明。这可以追溯到C.不需要extern
(或者可能不存在 - 不太确定)的时间。
换句话说,由于历史原因,这在C中是有效的,这样我们仍然可以编译在C标准之前编写的代码。
虽然为了允许代码在C ++中使用,我建议避免使用它。
答案 1 :(得分:2)
这是 Dennis Ritchie 和 Brain Kernighan 的经典著作《The C Programming Language》所说的:
<块引用>一个对象的外部声明是一个定义,如果它有一个初始化器。
没有初始值设定项且不包含 extern
说明符的外部对象声明是暂定定义。
如果某个对象的定义出现在翻译单元中,则任何暂定定义仅被视为冗余声明。
如果翻译单元中没有出现对象的定义,它的所有暂定定义将变成一个带有初始化器 0
的单一定义。
例如:
extern int a =123; // this declaration is a definition as a is initialized to 123
int a; //this is a tentative definition
int a;
int a;
int a;
/*all the above the three tentative declarations are redundant*/
int a;
int a;
int a;
进一步在代码中,如果没有 where do something as a=100
,我们认为 a
对应于这个全局范围变量而不是任何其他具有相同名称和类型的局部变量,那么最终,全局变量变量 a
应初始化为 0