【问题标题】:undefined reference to array of constants对常量数组的未定义引用
【发布时间】:2012-05-30 12:34:43
【问题描述】:

a.cpp

const unsigned char whatever[123] = { /* ... */ };

啊。

extern const unsigned char whatever[123];

b.cpp

#include "a.h"
unsigned char x = whatever[0];
// error: undefined reference to 'whatever'

为什么会出现未定义的引用错误?没有const,错误就会消失。

如何在多个翻译单元之间共享一组常量?

【问题讨论】:

  • 你不应该只在标题中声明它为 const 吗?您在标头中有一个外部变量,在 cpp 中有相同的变量...我会写:extern const unsigned char whatever[] = {'a','b',/*.etc.*/} 仅在我的标头中
  • extern也添加到a.cpp中的定义中。
  • a.cpp 是否包含#include "a.h"?如果没有,那么你应该添加它。

标签: c++ arrays header linker constants


【解决方案1】:

这是人们遇到的怪癖之一,只是您定义了一个 a.h 头文件,该文件声明了一个 123 个字符的 const 数组,并为其分配了外部链接。当它被包含在 b.cpp 文件中时,你基本上是在保证它会在其他翻译单元中找到它的编译器。

但是,每个const 变量都有一个不为人知的秘密——它被困在其定义的翻译单元中,因为它被隐式地赋予了静态链接。您承诺您的编译器whatever 将在多个翻译单元之间共享,但它实际上只忠于一个翻译单元并且不喜欢被共享。而且,好吧,其余的你都知道。

通过在实现文件中明确声明extern来解决。

【讨论】:

  • const 变量可能具有外部或内部链接,这取决于它们最初是如何声明的。说每个 const 变量都有内部链接是不正确的。
【解决方案2】:
3.5/3

 A name having namespace scope (3.3.5) has internal linkage if it is the name of
 ...
 — an object or reference that is explicitly declared const and neither explicitly declared extern nor previously declared to have external linkage;
 ...

变量喜欢

 const int x = 10;

被隐式定义为“静态”。

要使它们成为非静态的(因此是非内部的),请在“.c”文件中使用“extern”修饰符。

尝试使用

extern const unsigned char whatever[123] = { /* ... */ };

【讨论】:

  • 打败我。谷歌搜索的时刻returned the answer here.
  • 你的意思是in ".cpp" file 文件,对吧?显然,C 没有这个问题。
  • 当然,它是“.cpp”文件。我们都知道 C++ 不是 C 的严格超集。
【解决方案3】:

const 在 c++ 中默认具有静态(内部)链接,在您的 .c 文件中也使用 extern const。
This 是一个包含更多信息的随机 SO 线程。或者谷歌“c++中的链接”。

【讨论】:

  • 您的意思是in your .cpp file 文件,对吗?显然,C 没有这个问题。
  • 是的,这似乎是 c++/c 的不兼容问题之一。直到你问这个问题我才知道,不得不谷歌:)
【解决方案4】:

要解决这个问题,a.cpp 应该这样做:

#include "a.h"

whatever的定义之前。

如果范围内没有先前的声明,那么const unsigned char whatever[123] = {...}; 将具有内部链接。但如果包含a.h,则定义与前面的声明相匹配。头部定义了whatever与外部链接,定义与名称匹配。

正如其他人提到的,您也可以将extern 放在定义中,这样如果您忘记#include "a.h",就不会发生此错误。但最好的做法仍然是包含声明我们试图公开定义的任何内容的标头。

【讨论】:

    【解决方案5】:

    在 C++ 中,const 是编译时的 const,例如,

    const int cc = 100;
    int a[cc];
    

    我们可以在 C++ 中使用 const 来定义数组,但在 C 中不能。 由于它是 const,其值不能更改,因此不需要在多个文件之间共享它们。所以,也就是说, const 有内部联系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      相关资源
      最近更新 更多