为什么在 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 i
s" 合并为一个。
在上面的示例中,类型确实匹配,因为隐式应用了“使任何未知的东西成为 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
不是声明,您的代码无效。期间.
看看这些程序:
#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 i
s" 合并为一个。
在上面的示例中,类型确实匹配,因为隐式应用了“使任何未知的东西成为 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
不是声明,您的代码无效。期间.