我具有其中常数存储一个类中的一个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]
我真的不明白的错误,因为大小是恒定的,我的猜测是,在编译时的大小是未知的。
错误可以使用堆分配表(用新的分配)被绕过,但我禁止使用动态内存分配。 因此,我正在寻找另一种解决方案。
该定义是必需的搜索,在链接时。 所以,是的,大小是在编译阶段未知。
你这样写:
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;
};
似乎更自然的我。
警告的原因-由@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的位置 。