我正在使用visual C ++ 2010。 这个问题困扰了我很久。我可以在* .cpp中定义一个数组:
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]'
我很困惑是否有可能像这样使用数组? 有人可以帮帮我吗?
答案 0 :(得分:4)
如果要获取extern
数组的长度,则必须在头文件中显式声明数组的长度。否则,编译器根本无法访问该信息;它隐藏在定义的目标文件中,编译器无法读取它。
您可以通过其他两种方式做到您想做的事情:
您可以为数组的长度创建另一个变量。然后为此执行extern
,您将能够访问其他文件中的长度。
缺点:长度仍然不会静态已知。但是,如果你有链接时优化(不太可能)并且没有使用任何花哨的元编程的值,那可能不是问题。
您可以在标记数组末尾的末尾添加一个标记值。
下行:此方法也不会静态知道长度。此外,每次你想要数组的长度,它都是一个O(n)操作。如果您只是遍历数组,这可能不是问题。
答案 1 :(得分:3)
您可以使用带有extern
的数组,但是您要么(1)需要使大小的声明显式,要么(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
,这将指示最后一个条目。
答案 2 :(得分:2)
看起来_countof
是一个模板函数,需要在编译时知道数组大小。在编译时,只有extern
声明可见,并且没有提及数组大小。
一种可能的解决方法是添加另一个变量来保持大小。部首:
extern wstring pairs[][2];
extern const size_t pairs_size;
来源:
wstring pairs[][2] = { /*...*/ };
const size_t pairs_size = _countof(pairs);
或者,正如其他人所建议的,使用哨兵在运行时确定数组大小。
或者,如果使用情况允许,请切换到std::vector
或其他容器。 (这可能会破坏静态初始化器的顺序。)
答案 3 :(得分:1)
在数组末尾添加{ 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 ...
}
}
希望这就是你要找的东西。
答案 4 :(得分:0)
关闭但没有奖牌。这是适用于大多数现代编译器的东西。在声明数组的源文件中,执行以下操作:
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)