c++ - 在标头中声明一个使用全局变量作为元素的数组?
问题描述
我尝试使用全局变量作为数组的元素。问题是编译器在声明数组时想知道整数常量值。我以为我的全局变量已经是一个 const int ???
全局头文件“constants.h”
#ifndef CONSTANT_H
#define CONSTANT_H
namespace constants{
extern const int MY_ROW;
extern const int MY_COLUMN;
}
#endif // CONSTANT_H
定义全局“constants.cpp”
#include "constants.h"
namespace constants{
const int MY_ROW{55};
}
主函数“main.cpp”
#include "constants.h"
#include <iostream>
#include <array>
int main()
{
std::cout<<constants::MY_ROW<<std::endl;
int my_int_array[constants::MY_ROW];
return 0;
}
到目前为止一切顺利,我可以在 main 中使用全局变量作为元素声明一个数组。
但是如果我在另一个头文件中尝试“同样的事情”,编译器就会抱怨。
“测试.h”
#ifndef TEST_H
#define TEST_H
#include "constants.h"
class Test
{
public:
Test();
~Test();
void display_array();
private:
int test_array[constants::MY_ROW]; //error here???
};
#endif // TEST_H
错误信息:
**error: array bound is not an integer constant before ']' token|**
如果有人可以为黑暗带来光明,我将不胜感激。
解决方案
在main()
, 因为int my_int_array[constants::MY_ROW];
的值MY_ROW
对于编译器来说是未知的,因为它直到链接器阶段才被解析,所以my_int_array
不能在编译时分配,只能在运行时分配,并且只有当您使用支持可变长度数组的编译器 (请参阅为什么可变长度数组不是 C++ 标准的一部分?)。
但是对于class Test
,这根本不是一个选择。您不能在类中使用 VLA,因为编译器需要预先知道所有成员的完整大小,以便为类的实例设置内存存储。但是编译器不知道数组的大小,因此无法编译该类。
要执行您正在尝试的操作,您需要直接在它们的声明中初始化常量,而不是用 将它们分开extern
,例如:
#ifndef CONSTANT_H
#define CONSTANT_H
namespace constants{
const int MY_ROW = 55;
const int MY_COLUMN = ...;
}
#endif // CONSTANT_H
推荐阅读
- javascript - 在电子中,我如何加载一个 URL 作为我的启动器而不是本地文件
- java - 将 JSON 插入 SQLite(GSON + Volley)
- python - 合并类对象列表
- javascript - 服务工作者可以获取和缓存跨域资产吗?
- python - Python从dict创建对象列表
- c# - 需要在发送到核心 2 中的 API 之前修改查询参数
- autocad-plugin - 为什么加载我的 dll 后我的自定义命令没有显示在 AutoCAD 控制台中
- mysql - MySQL中的距离计算与Great Circle Mapper不同
- r - 当我尝试从 tif 文件中提取值时,为什么会得到 NA?
- spring-boot - 控制器类找不到 html 模板