我有一个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分配)绕过错误,但我禁止使用动态内存分配。因此,我正在寻找另一种解决方案。
答案 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。