13

我已经在 C 中声明了两个同名的全局变量。它应该给出错误,因为我们不能在同一个存储类中声明同名的变量。

我在 C++ 中检查过它——它给出了编译时错误,但在 C 中没有。为什么?

以下是代码:

int a;
int a = 25;
int main()
{

   return 0;
}

查看:在 Ideone 编写的代码

我想这可能是原因

C中的声明和定义

但在 C++ 中情况并非如此。我认为在 C++ 中,无论变量是在全局范围内声明还是在自动范围内声明,声明和定义都是同时发生的。

任何人都可以对它进行更多说明。

现在,当我定义变量两次给它两次值时,它给了我错误(而不是一个声明和一个定义)。

代码在:现在有两个定义

int a;
int a;
int a;
int a = 25;

int main()
{
return 0;
}
4

2 回答 2

13

在 C 中,多个全局变量被“合并”为一个。所以你确实只有一个全局变量,多次声明。这可以追溯到externC 中不需要(或者可能不存在 - 不太确定)的时候。

换句话说,由于历史原因,这在 C 中是有效的,因此我们仍然可以编译在 C 的 ANSI 标准出现之前编写的代码。

虽然,为了让代码在 C++ 中使用,我建议避免使用它。

于 2013-06-30T08:13:45.537 回答
2

这就是 Dennis Ritchie 和 Brain Kernighan 的经典著作“The C Programming Language”所说的:

  1. 一个对象的外部声明是一个定义,如果它有一个初始化器。

  2. 没有初始值设定项且不包含说明符的外部对象声明extern暂定定义

  3. 如果对象的定义出现在翻译单元中,则任何暂定定义都仅被视为冗余声明。

  4. 如果翻译单元中没有出现对象的定义,则其所有暂定定义将成为具有初始化程序的单个定义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;

进一步在代码中如果没有在哪里做a=100我们认为a对应于这个全局范围变量而不是任何其他具有相同名称和类型的局部变量的地方,那么最终,全局变量a将被初始化为0


于 2021-03-07T17:18:56.157 回答