问题描述
为什么我可以定义 static
对象然后可以将其声明为 extern
但不能将其声明为 extern
然后将其定义为 static
:
1-
static int x; // ok definition
extern int x; // ok declaration
int main(){
std::cout << x << '\n'; // 0 ok
}
2-
extern int x; // ok declaration
static int x; // error
-
AFAIK
static
使函数或对象链接成为内部。所以默认情况下全局非常量对象的链接是外部的。将其定义为static
使其链接成为内部链接(在定义它的 TU 的本地)。 -
AFAIK 和
extern
正好相反。而extern
只是引入了一个声明而不是一个定义。所以只要extern int x;
只是一个声明并且不违反 ODR 规则,为什么我在定义静态对象x
后不能使用它?而且只要我们可以在 TU 中的任何一点添加声明。void foo(); // declaration ok void foo(){} // definition ok void foo(); // declaration ok extern int x; // ok declaration int x = 100; // ok definition extern int x; // ok declaration
-
注意:我知道在我的程序中这样做是不合逻辑的,即使对于第一个工作代码:因为
extern
向编译器引入了一个声明,该声明在程序中只有一个定义,并且链接器无法从外部看到static
定义。换句话说,extern
需要在程序中的某处有一个单一的非静态定义。但只是为了练习,我想知道为什么在我的程序中 1 有效而 2 无效?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)