C 中允许重定义,但 C++ 中不允许?
为什么这段代码在 C 中可以运行,但在 C++ 中却不行?
int i = 5;
int i; // but if I write int i = 5; again I get error in C also
int main(){
// using i
}
Why does this code work in C but not in C++?
int i = 5;
int i; // but if I write int i = 5; again I get error in C also
int main(){
// using i
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
C 中允许临时定义,但 C++ 中不允许。
临时定义是任何没有存储类说明符且没有存储类说明符的外部数据声明。初始化程序。
C99 6.9.2/2
因此
int i
是一个暂定定义。 C 编译器会将所有暂定定义组合成i
的单个定义。在 C++ 中,由于 单一定义规则,您的代码格式不正确(第 3.2/1 ISO C++ 节)
因为在这种情况下,由于初始值设定项 (5),它不再保留为暂定定义。
只是为了提供信息
另请查看这篇关于外部变量的优秀文章。
Tentative definition is allowed in C but not in C++.
A tentative definition is any external data declaration that has no storage class specifier and no initializer.
C99 6.9.2/2
So
int i
is a tentative definition. The C compiler will combine all of the tentative definitions into a single definition ofi
.In C++ your code is ill-formed due to the One Definition Rule (Section 3.2/1 ISO C++)
Because in that case it no longer remains a tentative definition because of the initializer (5).
Just for the sake of information
Also check out this excellent post on external variables.
Tha 称为暂定定义。仅在 C 中允许。
从此处:暂定定义
Tha is called tentative definition. It's allowed only in C.
From here: Tentative Definitions
要更好地理解暂定定义,请阅读此
To understand tentative definition better, go through this