C ++ 11可变大小的POD结构

时间:2014-03-24 11:33:07

标签: c++ gcc c++11 struct warnings

我正在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 ++不包含的例外之一。我会考虑使用不同的方法。但仅仅是因为我的好奇心,哪些编译器允许将其作为非标准扩展,以及如何让它们在没有警告的情况下接受它?

由于

3 个答案:

答案 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。您确定无法找到更好的解决方案吗?