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

why there is this difference in initializing global variable between C and 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’ does not name a type i=99;

#include<iostream>

using namespace std;

int i;
i=99;

int main()
{
    cout<<i<<endl;
    return 0;
}

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

1: 这会阻碍 C++ 版本成功升级到 运行 吗?

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

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

在 C 中,this 在全局范围内

int i;
i = 42;

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

在上面的示例中,类型确实匹配,因为隐式应用了“使任何未知的东西成为 int”规则到 [=12= 的第二个定义].

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

float f;
f = 42;

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


对 C++ 不是 100% 确定,但我假设这个“使任何未知的东西成为 int”规则在 C++ 中根本不存在。所以在全局范围内,像 i = 42; 这样的东西是无效的,它完全独立于之前是否声明或定义了 i

在文件的那个位置,任何一行代码都必须是一个声明;它不能是对现有对象的赋值。

在 C 中,有一条声明可以省略类型的规则(默认为 int),因此您的行 可以 被解析为该语言的声明(和带有初始化程序的定义)。此外,由于 C 具有 tentative definitions,因此允许此 "second" 定义:

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

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