为什么在初始化 C 和 C++ 之间的全局变量时会有这种差异?



看看这些程序:

#include<stdio.h>
int i;       //C implementation works fine with this initialization of variable i
i=108;
int main()
{
printf("%d",i);
return 0;
}

在此代码(c ++版本)中,它会抛出错误:

"i"不命名类型 i=99;

#include<iostream>
using namespace std;
int i;
i=99;
int main()
{
cout<<i<<endl;
return 0;
}

现在我读到导致成功运行 C版本的是隐式 int,后来从 C99 版本中删除。

1:这是否阻碍了C++版本成功运行?

2:如果这个隐式 int是第一个代码背后的原因,那么为什么编译器不会抛出两次定义"i"的错误?

请指出我对这个概念的错误理解。

在 C 中,这在全局范围内

int i;
i = 42;

将第 2 行作为对第 1 行中定义的内容的重新定义。如果类型匹配,编译器接受它并将"两个i"合并为一个。

在上面的例子中,类型确实匹配,因为隐式地将">使任何未知的东西成为int"规则应用于i的第二个定义。

例如,以下行将无法编译:

float f;
f = 42;

因为第 2f将被视为int,这与第 1f的类型不匹配,这是一个float


不是 100% 确定C++,但我认为这种">让任何未知的东西成为int"的规则根本不存在于C++中。因此,在全球范围内,像i = 42;这样的东西是无效的,这与之前是否声明或定义过i完全无关。

在文件中的此时,任何代码行都必须是声明;它不能是现有对象的赋值。

在 C 语言中,有一条规则,声明可以省略类型(默认为int),因此您的行可以在该语言中解析为声明(以及带有初始化器的定义)。此外,由于 C 有暂定定义,因此允许使用这个"第二个"定义:

int i;        // tentative definition
int i = 42;   // "int" added automatically

这两个规则结合起来使代码在 C 中有效,C++ 都没有。因此,在C++中,i = 42不是声明,您的代码无效。时期。

相关内容

  • 没有找到相关文章

最新更新