簡體   English   中英

C ++ 11可變大小POD結構

[英]C++11 variable size POD struct

我正在C ++ 11中編寫一個低級數據操作代碼,並且我想在結構的末尾使用舊的C靈活數組功能( 請參閱此處的一些信息 )。

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 ++所沒有的例外之一。 我將考慮使用其他方法。 但是僅出於好奇,哪個編譯器允許將此作為​​非標准擴展,以及如何使它們在沒有警告的情況下接受它?

謝謝

作為參考,“ 靈活數組成員”部分中的ISO C和ISO C ++狀態之間的不兼容性

C ++不支持靈活的數組成員。

(此功能可能是某些C ++編譯器的擴展功能,但可能僅對POD結構類型有效。)

gcc的確支持 clang 作為擴展 顯然,這也可以在Visual Studio中使用-如果您不使用/Za ,可以實時查看它 ,我可以在Stephan T. Lavavej的這篇文章之外找到任何文檔。

我不認為這是沉默的警告可移植的方式,而是要像源內GCC部分禁用迂腐的警告應該工作gcc

您可以使用帶有自定義運算符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} };
}

您必須檢查哪些標准,C ++ 11仍然不允許使用0長度數組(第8.3.4 / 1節)以及C99(第6.7.5.2/1節)。 看來它們只是C的功能,但我寧願說一個舊的C hack。 您確定無法找到更好的解決方案嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM