c++ - 在源文件中定义数组并在其他源文件中使用它

标签 c++ arrays visual-studio-2010 c++11

我正在使用 Visual C++ 2010。 这个问题让我困惑了很长时间。我可以在 *.cpp 中定义 suan 数组:

wstring pairs[][2] =
    {
        {L"\\ben\\b",               L"English"},
        {L"\\bfr\\b",               L"French"},
        {L"\\bit\\b",               L"Italian"},
        {L"\\bde\\b",               L"German"},
        {L"\\bes\\b",               L"Spanish"},
        {L"\\bpl\\b",               L"Polish"},
        {L"\\bru\\b",               L"Russian"},
        {L"\\bzh_cn\\b",            L"ChinesePRC"},
        {L"\\bzh_tw\\b",            L"ChineseTaiwan"},
        {L"\\bja\\b",               L"Japanese"},
        {L"\\bko\\b",               L"Korean"},
        {L"\\bpt\\b",               L"PortugueseStandard"},
        {L"\\btr\\b",               L"Turkish"},
        {L"\\bnl\\b",               L"Dutch"},
        {L"\\blt\\b",               L"Lithuanian"},
        {L"\\blv\\b",               L"Latvian"},
        {L"\\bet\\b",               L"Estonian"}
    };

并像这样在 *.h 中声明数组:

extern wstring pairs[][2];

现在我可以在其他 *.cpp 中使用数组,但我无法获得 pairs 的大小使用代码:

size_t cnt = _countof(pairs);

我收到错误信息:

1>e:\work\vc++\justtest\console\console.cpp(45): error C2893: Failed to specialize function template 'char (*__countof_helper(_CountofType (&)[_SizeOfArray]))[_SizeOfArray]'
1>          With the following template arguments:
1>          'std::wstring [2]'

我很困惑是否可以像这样使用数组? 谁能帮帮我?

最佳答案

如果要获取extern数组的长度,必须在头文件中显式声明数组的长度。否则,编译器根本无法访问该信息;它隐藏在编译器不会读取的定义对象文件中。

还有其他两种方法可以让您做您想做的事:

  1. 您可以为数组的长度创建另一个变量。然后也为此执行 extern,您将能够访问其他文件中的长度。

    缺点:长度仍然不会静态已知。但是,如果您进行了链接时优化(不太可能)并且没有将值用于任何花哨的元编程,那可能不是问题。

  2. 您可以在标记数组末尾的末尾添加一个标记值。

    缺点:使用这种方法也无法静态知道长度。此外,每次你想要数组的长度时,它都是一个 O(n) 操作。如果您只遍历数组,这可能不是问题。

关于c++ - 在源文件中定义数组并在其他源文件中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14035341/

相关文章:

arrays - 打印 Core Data bool 数组返回换行符

visual-studio-2010 - MSBuild/VS2010 : How to reference "RuntimeLibrary" compiler setting in a VS2010 "Property Sheet"

c++ - 继承的析构函数是否包含在虚拟表中?

c++ - 写入和读取记录到.dat 文件 C++

java - 如何从该数组中获取随机字符串作为获胜者打印?

c - 错误 C2065 : 'cp' : undeclared identifier

c++ - VS 2010 中 <afxcontrolbars.h> 的问题

c++ - 为什么在使用初始化列表时非显式构造函数被显式构造函数隐藏?

c++ - 哪一个使用c++ STL容器或MFC容器?

javascript - 将新对象推送到嵌套对象