如何解决我可以将对象声明为 extern 但将其定义为静态对象吗?
为什么我可以定义 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 举报,一经查实,本站将立刻删除。