首页 > 解决方案 > 在标头中声明一个使用全局变量作为元素的数组?

问题描述

我尝试使用全局变量作为数组的元素。问题是编译器在声明数组时想知道整数常量值。我以为我的全局变量已经是一个 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|**

如果有人可以为黑暗带来光明,我将不胜感激。

标签: c++

解决方案


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

请参阅在 C++ 标头中定义常量变量


推荐阅读