【问题标题】:The usage of extern in c++c++中extern的使用
【发布时间】:2013-04-05 19:00:33
【问题描述】:

我很难理解“外部”的工作原理。 我搜索了谷歌,但似乎没有我正在尝试的特定示例

如果我有一个引用 one.h 的文件 main.cpp 在其中我有一个名为 LIST1 的列表(这是一个 100 x 100 的双数组) 所以我有双 List1[100][100];

请问如何在 one.cpp 中使用此列表?

extern double LIST1[100][100]

不工作:/

main.cpp:

#include "one.h"

extern double LIST1[100][100];

一个.cpp:

void one::useList()
{
for(j = 0; j < 100; j++)
   {
     for(i = 0; i < 100; i++)
    {
         LIST1[j,i] = 0.5;
    }
 }
}

这就是我所拥有的。

我得到的错误:

1>main.obj : 错误 LNK2001: 无法解析的外部符号 "double (* LIST1)[100]" (?LIST1@@3PAY0GE@NA)

【问题讨论】:

  • 你能清楚地说明你在哪个文件中有什么代码吗?您当前的描述相当混乱。
  • 请定义“不工作”
  • LIST1[j,i] = 0.5; 也应该给出一个错误 - 你的意思是LIST1[j][i] = 0.5;
  • 注意LIST1的类型是double[100][100];错误消息中的类型是伪造的

标签: c++ extern


【解决方案1】:

命名空间范围内的变量声明始终是一个定义除非您在其上加上extern;那么它只是一个声明。

C++ 中的一条重要规则是,您不能有多个同名对象定义。如果您的头文件只包含double LIST1[100][100];,只要您只将它包含在一个翻译单元中,这将起作用。但是,只要将头文件包含在多个翻译单元中,您就会拥有LIST1 的多个定义。你违反了规则!

因此,要从多个翻译单元访问全局变量,您需要确保头文件中只有一个声明。我们使用extern 来做到这一点:

extern double LIST1[100][100];

但是,您不能只包含标头并尝试使用此对象,因为还没有定义。这个LIST1 声明只是说这种类型的数组存在于某个地方,但我们实际上需要定义它来创建对象。因此,在单个翻译单元(通常是您的 .cpp 文件之一)中,您需要输入:

double LIST1[100][100];

现在,您的每个.cpp 文件都可以包含头文件,并且只能获得声明。在你的程序中有多个声明是非常好的。您的.cpp 文件中只有一个 具有此定义。

【讨论】:

    【解决方案2】:

    在 C++ 中,就像之前的 C 一样,每个源文件都被编译成一个目标文件。然后链接所有目标文件以创建可执行程序。

    为了共享符号(函数、全局变量),有几个关键字告诉编译器哪些是文件本地的,哪些是私有的,哪些是从其他文件导入的。

    `extern' 关键字表示符号可以被访问,但不能被定义。它应该在其他一些模块中定义(作为全局)。如果不是,您会在链接时收到“未定义符号”错误。

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2018-09-30
      相关资源
      最近更新 更多