我可以将对象声明为 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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...