在源文件中定义数组,然后在其他源文件中使用它

define array in source file and use it in other source file

本文关键字:源文件 其他 定义 数组 然后      更新时间:2023-10-16

我正在使用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:workvc++justtestconsoleconsole.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)操作。如果您仅通过数组迭代,这可能不是问题。

您可以使用带有extern的数组,但是您(1)需要将大小的声明equaklicit进行宣布,或者(2)放置一个终结者输入,类似于NULL终结者一个字符串,用于计算运行时条目的数量。

解决方案1:

extern wstring pairs[17][2];

随着此更改,sizeof(pairs)将被正确定义。

解决方案2:

wstring pairs[][2] =
{
    {L"\ben\b",               L"English"},
    {L"\bfr\b",               L"French"},
    ...
    {L"\blv\b",               L"Latvian"},
    {L"\bet\b",               L"Estonian"}, {0, 0}
};

现在,您可以通过pairs快速循环到达*pairs[i] == 0,这将指示最后一个条目。

看起来_countof是一个模板功能,需要在编译时知道数组大小。在编译时,只能看到您的extern声明,并且不提到数组大小。

周围的一项可能工作是添加另一个变量以保持大小。标题:

extern wstring pairs[][2];
extern const size_t pairs_size;

来源:

wstring pairs[][2] = { /*...*/ };
const size_t pairs_size = _countof(pairs);

或正如其他人所建议的那样,使用哨兵在运行时确定阵列大小。

或,如果使用允许,请切换到std::vector或其他容器。(这可能会与静态初始化器的顺序混乱。)

{ NULL, NULL }添加到数组的末端。然后使用类似这样的循环:

extern wstring pairs[][2];
...
int do_stuff()
{
    for(int i = 0; pairs[i][0] != NULL; i++)
    {
      ... do things with pairs as you like ... 
    }
}

希望这是您想要的。

关闭但没有奖牌。这是应该与大多数现代编译器一起使用的东西。在声明数组的源文件中,执行类似:

const unsigned int amrd_count=sizeof( amrd ) /sizeof( amrd[0] );

在您的标题中,插入类似的内容:

extern T amrd[];
extern const unsigned int amrd_count;

对我来说,这与Xcode(Apple LLVM版本9.0.0(Clang-900.0.39.2))一起使用,GCC(GCC)4.8.5 20150623(Red Hat 4.8.5-16)