![](/img/trans.png)
[英]Why is multiple definition of a const global variable allowed in C++ and not in C?
[英]Why Global variable redefinition is not allowed?
#include<stdio.h>
int i =0;
i=2;
int main(){
// some Code here
return 0;
}
错误: /Users/vaibhavkumar/Documents/C/primeFactors.c|4|error: redefinition of 'i'|
错误: /Users/vaibhavkumar/Documents/C/primeFactors.c|4|error: redefinition of 'i'|
那不是重新定义,而是赋值。
赋值与 C 中的初始化不同,并且不能在函数之外完成——在那个上下文中没有执行线程,那么什么时候完成?
在这方面,具有static
链接的变量与全局变量(具有extern
链接)没有什么不同,但是静态链接变量对于单个编译单元是本地的,并且在外部是不可见的。 如果在不同的编译单元中声明两个同名的静态变量,它们是完全独立且不相关的变量——它们甚至不必是相同的类型。
请注意,静态链接与静态存储不同,但它们使用相同的关键字。 所有全局和静态链接变量都隐含地具有静态存储类,但声明为静态的函数局部变量具有静态存储类——即它始终存在——就像一个全局变量,但仅在本地可见。
Clifford 解释了赋值和初始化之间的区别。 但只是为了完整性:您不能在函数之外进行赋值。 只有初始化。
但是为什么会出现这个奇怪的错误? 这是因为隐式声明。
如果我们谈论的是全球空间,那么这个
int i = 0;
i = 2;
实际上相当于:
int i = 0;
int i = 2;
此代码将打印 42:
#include <stdio.h>
i = 42;
int main(void) {
printf("%d\n", i);
}
原因是向后兼容。 不要使用这个“功能”
看似非常不相关的奇怪消息背后的逻辑是这样的:
i=2;
在全局空间中,必须是声明
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.