我正在C ++ 11中编写一个低级数据操作代码,我想在结构的末尾使用灵活数组的旧的C特性(see some info here)。
struct variableCell
{
/**
* @brief Size in bytes of following data.
*/
std::uint32_t cellSize;
/**
* @brief Data stored in overlay.
*/
std::uint8_t cellData[];
};
我将GCC与参数一起使用
-Wall -pedantic -std=c++11
我得到了这个警告
xxx.h:xx: warning: ISO C++ forbids zero-size array 'variableCell' [-Wpedantic]
这曾经是一个非常正确的功能。请不要告诉我,我的方法是错误的 - 它始终是低级数据操作的正确方法。
为什么标准改变了这个以及如何禁用这一个特定的警告?
由于
修改 我道歉,我误认为C唯一的功能,它变成了C ++不包含的例外之一。我会考虑使用不同的方法。但仅仅是因为我的好奇心,哪些编译器允许将其作为非标准扩展,以及如何让它们在没有警告的情况下接受它?
由于
答案 0 :(得分:2)
作为灵活数组成员部分中的参考Incompatibilities Between ISO C and ISO C++状态:
C ++不支持灵活的数组成员。
(此功能可能由某些C ++编译器作为扩展提供,但可能仅对POD结构类型有效。)
gcc does support this as an extension以及clang。显然,如果您不使用/Za
Visual Studio - see it live,我也可以在post by Stephan T. Lavavej找到除此Partially disable pedantic warnings in gcc within source之外的任何文档。
我认为没有一种方法可以让警告静音,但像{{3}}这样的内容应该适用于gcc
。
答案 1 :(得分:1)
您可以使用带有自定义运算符new
的c ++来模拟它struct VariableCell {
VariableCell( std::uint32_t sz ) : cellSize(sz) {}
std::uint8_t* data() { return reinterpret_cast<std::uint8_t*>(this+1); }
static void* operator new(std::size_t sz, std::uint32_t dataSz) {
return ::operator new(sz+dataSz);
}
private:
std::uint32_t cellSize;
};
std::unique_ptr<VariableCell> CreateVariableCell( std::uint32_t size ) {
return std::unique_ptr<VariableCell>{ new (size) VariableCell{size} };
}
答案 2 :(得分:0)
你必须检查哪些标准,C ++ 11仍然不允许0长度数组(§8.3.4/ 1),以及C99(§6.7.5.2/ 1)。看来它们只是C的一个特色,但我宁愿说一个旧的C hack。您确定无法找到更好的解决方案吗?