外部数组定义

发布于 2024-12-01 02:31:40 字数 640 浏览 0 评论 0原文

我想在不同的 cpp 文件中定义字符串数组,但是当我尝试使指针(数组元素)也为 const 时,定义和声明之间似乎存在一些差异。使用与声明相同的定义似乎工作正常,所以我怀疑初始化不是问题。在下面的代码中,我注释掉了有问题的 const - 所以它会编译,但如果 const 未注释,链接器(使用 g++ 4.6 和 VS10 测试)将找不到 ext_string_array。

main.cpp:

#include <iostream>

const char* const string_array[2] =
{
  "aaa",
  "bbb"
};

extern const char* /*const*/ ext_string_array[2]; // <- offending const

int main()
{
  std::cout << string_array[0];
  std::cout << ext_string_array[0];
}

定义.cpp:

const char* /*const*/ ext_string_array[2] = // <- offending const
{
  "aaa",
  "bbb"
};

I would like to define array of strings in different cpp file, but there seems to be some discrepancy between definition and declaration when I try to make pointer (array element) also const. Using the same definition as declaration seems to work fine, so I suspect initialization is not an issue. In the code below I have commented out offending const - so it will compile, but if const is un-commented, linker (tested with g++ 4.6 & VS10) will not find ext_string_array.

main.cpp:

#include <iostream>

const char* const string_array[2] =
{
  "aaa",
  "bbb"
};

extern const char* /*const*/ ext_string_array[2]; // <- offending const

int main()
{
  std::cout << string_array[0];
  std::cout << ext_string_array[0];
}

definition.cpp:

const char* /*const*/ ext_string_array[2] = // <- offending const
{
  "aaa",
  "bbb"
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

送你一个梦 2024-12-08 02:31:40

在这种情况下,const 也意味着静态,除非您还指定了 extern。将您的 .cpp 文件更改为此

extern const char* const ext_string_array[2] =
{
  "aaa",
  "bbb"
};

In this context const also means static, unless you also specify extern. Change your .cpp file to this

extern const char* const ext_string_array[2] =
{
  "aaa",
  "bbb"
};
伴我心暖 2024-12-08 02:31:40

C++ 2003,3.5 程序和链接3

具有命名空间范围 (3.3.5) 的名称具有内部链接,如果它是
[...]

——显式声明为 const 且既未显式声明为 extern 也未事先声明为具有外部链接的对象或引用; [...]

所以你需要在声明中显式的 extern

C++ 2003, 3.5 Program and Linkage, 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; [...]

So you need an explicit extern in the declaration..

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文