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

时间:2014-01-15 12:22:35

标签: c++ g++

我有一个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]

我真的不明白错误,因为大小是一个常数,我的猜测是在编译时大小是未知的。

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

2 个答案:

答案 0 :(得分:2)

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

你写的是:

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; 
};

对我来说似乎更自然。

答案 1 :(得分:0)

警告原因 - 正如@nawaz已提到的那样(编译时数组中的变量大小 - 可能不受所有编译器支持/允许)。

可以这样尝试:

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

通常,在对char*进行一些string转换时会出现上述问题(受char缓冲区中的实际数据大小限制)。因此,在这种情况下,可以使用类似的东西;

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 here