在源文件中定义数组,然后在其他源文件中使用它
define array in source file and use it in other source file
我正在使用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
数组的长度,则必须明确声明标题文件中数组的长度。否则,编译器根本无法访问该信息;它埋在定义对象文件中,编译器不会读取。
您可能还有两种方法可以做自己想做的事情:
-
您可能会为数组的长度创建另一个变量。然后为此做一个
extern
,您将能够访问另一个文件中的长度。下降:长度仍然不会是已知的。但是,如果您有链接时间优化(不太可能),并且没有用于任何精美元编程的值,那可能不是问题。
-
您可以在标记数组末端的末端添加哨兵值。
下降:使用此方法也不是静态的。此外,每当您想要数组的长度时,都是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)
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 无法使用 CMake 从其他文件夹添加源文件
- GNU 在看到其他同名文件时重用源文件
- 结构 #ifndef 灰显,其他源文件无法访问
- 获取对源文件中特定函数的所有调用并生成其他文件(使用 C、C++预处理器或脚本)
- C++ 编译时检查微控制器引脚是否已从其他源文件初始化
- 在源文件中定义数组,然后在其他源文件中使用它
- 在其他源文件中没有通用的头文件访问功能
- 包括来自其他项目的源文件的最佳实践
- 使用全局变量作为在其他源文件中分配的函数的参数
- 无法打开源文件,其他目录已更改
- 如何将源文件从其他目录树包含到Bool.Test用例中
- 静态库头文件包括其他头文件。我是否需要这些头文件的实现/源文件?