【问题标题】:extern const in c++c++中的外部常量
【发布时间】:2012-03-28 12:04:12
【问题描述】:

我有一个名为 abc.h 的头文件,我想在其中定义一个带有外部链接的常量。因此它包含语句

---------------abc.h-------------------------

extern const int ONE = 1;

接下来,我有 main.cpp,我想在其中使用 ONE 的值。因此,我在 main.cpp 中声明 ONE,然后将其用作

---------------main.cpp---------------------

extern const int ONE;
int main()
{
     cout << ONE << endl;
}

我收到错误“ONE 的多个定义”。

我的问题是,我如何声明一个带有外部链接的 const,然后在不同的文件中使用它,这样常量只有一个内存位置,而不是每个文件都包含一个静态版本的常量。


我从 main.cpp 中删除了#include "abc.h",一切正常。

g++ abc.h main.cpp -o main

ONE 的地址在 header 和 main 中是相同的。所以它有效。

但我不明白编译器如何在 main.cpp 中没有包含语句的情况下解析 ONE 的定义

g++ 似乎有一些魔力。这是一种不好的做法,main.cpp 的读者不知道在哪里声明 ONE,因为 main.cpp 中没有包含“abc.h”?

【问题讨论】:

  • 您确定在这两个位置都有extern 吗? (您上面编译的代码对我来说很好)。另外,请查看Mixing extern and const

标签: c++


【解决方案1】:

abc.h:

extern const int ONE;

abc.cpp:

#include "abc.h"

const int ONE = 1;

ma​​in.cpp:

#include "abc.h"

int main() {
     cout << ONE << endl;
}

【讨论】:

  • 有趣的是,extern 声明必须在与定义变量相同的翻译单元中进行。在此示例中,您首先有效地声明它 extern const,然后在同一个文件中定义它。这对于非常量变量不是必需的(只需定义它们并且它们具有外部链接)
  • 或者,abc.cpp 可以只包含一行 extern const int ONE = 1; 更多解释参见 C++ Primer 5th edition, p. 60.
  • @YiboYang 那么 main.cpp 怎么访问 ONE 呢?另外,请不要假设每个人都拥有与您相同的书籍,并且当您参考某些内容时,请尝试确保它可以在线免费访问。
  • @BrankoDimitrijevic ONE 通过标题 abc.hmain.cpp 中声明。书上的参考书基本上说,为了跨多个文件使用const变量,你可以在一个文件(通常是源文件)中定义它,并在使用它的其他文件中声明它(通常通过头文件的方式) ,并且定义/声明应该是extern
  • @YiboYang 你说:"abc.cpp 只能包含一行extern const int ONE = 1;"。我以为你的意思是 abc.h 不应该包含任何东西。
【解决方案2】:

命令行

g++ abc.h main.cpp -o main

导致编译器使用头文件abc.h作为另一个模块。

通常一个使用 #include "abc.h" 并编译为:

g++ main.cpp -o main


线

extern const int ONE = 1;

是一个定义,所以它应该只存在于一个模块中。 在标题中,我们放置 declarations(没有实际值的分配):

extern const int ONE;

它们可以多次包含在模块中。 当您包含此类声明时,您的定义可以省略“extern”:

#include "abc.h"
const int ONE = 1;

(问题已经7年了,所以作者已经肯定知道了,但我想为其他人澄清一下。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2014-07-02
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多