我的代码中有以下三个文件(删除了大部分代码.这只是为了隔离问题).
global.h:
//global.h
#ifndef GLOBAL_H
#define GLOBAL_H
extern const int ARRAYSIZEX;
extern const int ARRAYSIZEY;
extern const int ARRAYSIZEZ;
#endif //GLOBAL_H
global.cpp:
//global.cpp
#include "global.h"
const int ARRAYSIZEX = 5;
const int ARRAYSIZEY = 2;
const int ARRAYSIZEZ = 4;
主要:
//main
#include "global.h"
using namespace std;
someType mySomeTypeArray[ARRAYSIZEX][ARRAYSIZEY][ARRAYSIZEZ];
int main(int argc, char **argv)
{
//...
}
编译在mySomeTypeArray的声明中给出了三个错误.
error: array bound is not an integer constant before ‘]’ token
我希望将此全局变量和数组大小定义保留在global.h / cpp中,仅用于组织,以便我的所有配置参数都在一个位置.实现我想要做的事情的正确方法是什么?
谢谢
解决方法:
您的声明失败,因为需要在编译时评估数组大小,并且您的封装方案实际上是隐藏编译器中的值.这是事实,因为编译器在单个翻译单元上工作.在编译main.cpp时,编译器只能看到extern const int ARRAYSIZEX,这要归功于include语句,而不是单独的转换单元中可见的值,因此无法弄清楚内存布局.
虽然const变量可以在某些上下文中用作数组大小,但该语言提供了更合适的constexpr限定符,该限定符带有一组限制,强制执行编译时评估和数组大小的适用性.我建议在适当的时候始终使用它,因为它会指出你在这种情况下的错误.在这种情况下,您将收到编译器错误,因为extern constexpr声明格式错误,暗示了正确的解决方案:直接在头文件中保存编译时常量的值.
global.h
constexpr int ARRAYSIZEX = ...;
constexpr int ARRAYSIZEY = ...;
constexpr int ARRAYSIZEZ = ...;
main.cpp中
#include "global.h"
someType mySomeTypeArray[ARRAYSIZEX][ARRAYSIZEY][ARRAYSIZEZ];