clang关于__attribute __((packed)),即使需要打包结构

时间:2018-02-01 13:43:33

标签: c++ clang

我有一个需要打包的结构(没有打包大小是20个字节,但我需要16才能读/写)。当我添加packed属性时,我对结构的所有成员都有error: packed attribute is unnecessary for个警告。使用pragma沉默错误时,代码编译良好,结构的大小为16,但如果我删除了pragma,则失败(因为我使用的是-Werror)。 clang是不是错误地发出了这个警告,还是我做错了什么?

#include <cstdint>

typedef struct __attribute__((packed))
{
    uint16_t wFormatTag;
    uint16_t nChannels;
    uint32_t nSamplesPerSec;
    uint32_t nAvgBytesPerSec;
    uint16_t nBlockAlign;
}
WAVEFORMAT;

int main()
{
    WAVEFORMAT w;
    (void)w;
}

我正在使用Xcode9工具链:

clang -v
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0

使用-Weverything编译时会生成警告:

clang++ -Weverything pack.cpp

pack.cpp:8:10: warning: packed attribute is unnecessary for 'wFormatTag' [-Wpacked]
    WORD wFormatTag;
        ^
...

1 个答案:

答案 0 :(得分:2)

确实,clang似乎错误地发出了警告。这已在最近的铿锵版中修复。

特别是,警告不会与clang 6.0候选版本clang version 6.0.0-svn323772-1~exp1)一起重现。我能够使用以前的clang版本复制警告,包括5.0.1,4.0.0和3.8.0。

我认为这是纠正问题的铿锵提交:
this does not appear to be a good practice

不幸的是,可能需要一些时间,直到Xcode的铿锵声看到这个问题。