警告“ISO C ++禁止可变大小的数组”具有恒定大小的数组(Warning “ISO C++ fo

2019-10-19 05:44发布

我具有其中常数存储一个类中的一个C ++程序。 并在代码别的地方我使用这些常量作为数组的大小之一。

下面是一个例子:

Constants.h

#ifndef CONSTANTS_H
#define CONSTANTS_H

class Constants
{
public:
    static const unsigned int C_BufferSize;
};

#endif

Constants.cpp

#include "Constants.h"

const unsigned int Constants::C_BufferSize(128);

main.cpp中

#include "Constants.h"

int main()
{
    char buffer[Constants::C_BufferSize];
    return 0;
}

当我编译这段代码-std=c++11 -pedantic我得到以下警告:

main.cpp中:5:37:警告:ISO C ++禁止可变长度数组 '缓冲器'[-Wvla]

我真的不明白的错误,因为大小是恒定的,我的猜测是,在编译时的大小是未知的。

错误可以使用堆分配表(用新的分配)被绕过,但我禁止使用动态内存分配。 因此,我正在寻找另一种解决方案。

Answer 1:

定义是必需的搜索,在链接时。 所以,是的,大小是在编译阶段未知。

你这样写:

class Constants
{
public:
    static const unsigned int C_BufferSize = 128; //initialize here
};

然后只提供在定义 .cpp文件:

const unsigned int Constants::C_BufferSize; //no initialization here

但随后,更理智的做出Constants命名空间,而不是一类:

namespace Constants  //NOTE : a namespace now
{
    static const unsigned int BufferSize = 128; 
};

似乎更自然的我。



Answer 2:

警告的原因-由@nawaz已经提到( 可变大小在编译时数组-可能不支持/通过所有的编译器允许 )。

可以尝试,而不是这样:

std::vector<char> buffer(Constants::C_BufferSize);

通常做一些时就会出现上述问题char*转换为string (在该炭缓冲由实际数据大小限制)。 因此,在这种情况下,这可以使用类似;

std::string ConvertCharDataBySizeToString(const char* s, std::size_t size)
{
    std::vector<char> data(s, s+size);
    return ( std::string(data.begin(), data.end()) );
}

参考/ s的位置 。



文章来源: Warning “ISO C++ forbids variable-size array” with constant size array
标签: c++ g++