C++错误:字段必须具有常量大小

C++ error: fields must have a constant size

本文关键字:常量 错误 字段 C++      更新时间:2024-05-10

有人能给我一个如何解决以下问题的提示吗:

clang++-7 -pthread -std=c++17 -o main createLibrary/configuration.cpp createLibrary/growbox.cpp createLibrary/helper.cpp createLibrary/httprequests.cpp main.cpp
In file included from createLibrary/configuration.cpp:2:
In file included from createLibrary/configuration.h:1:
In file included from createLibrary/growbox.h:12:
createLibrary/httprequests.h:13:10: error: fields must have a constant size:
'variable length array in structure' extension will never be supported
char device[configuration::maxNameSize];
^
1 error generated.

我将按照configuration.hhttprequests.h的顺序包括.h文件。我希望在configuration.cpp文件中配置所有必要的配置参数,但我得到了显示的错误。我在这里做错了什么?

configuration.h

extern int const maxNameSize;

配置.cpp

int const configuration::maxNameSize = 30;

httprequests.h

char device[configuration::maxNameSize];

httprequests.cpp

char HTTPREQUESTS::device[configuration::maxNameSize];

extern const int不是常量表达式。

如果,变量在点p的常量表达式中可用

  • 变量为
    • constexpr变量,或
    • 它是一个常量初始化变量
    • 参考类型或
    • const限定的积分或枚举类型
  • 并且变量的定义可以从P得到
  • 以及
    • P与变量的定义在同一个翻译单位

(增加强调(

我希望在configuration.cpp文件

你运气不好。maxNameSize必须对其编译时用户可见。

像这个一样声明maxNameSize

// configuration.h
class configuration
{
public:
static const int maxNameSize = 30;
...
};

无需在configuration.cpp.中定义

您的方法不会使maxNamesize成为编译时常数。

EDIT,我假设configuration是一个类。如果它是一个名称空间,那么请执行以下操作,而不是

// configuration.h
namespace configuration
{
const int maxNamesize = 30;
...
}

常量是一个定义规则的例外,所以可以在头文件中定义它们。

我做错了什么?

您定义了一个数组变量,其大小不是编译时常数。

解决方案:您可以选择

  • 在使用变量的同一转换单元中将其定义为数组的大小,这样它就可以是编译时间常数。假设数组位于标头中,标头可能包含在多个转换单元中,则无法从外部定义大小。它必须是静态的或内联的
  • 或者改用动态数组。创建动态数组的最简单方法是使用std::vector