在mingw的gcc-5.3下,具有混合位域和枚举的意外sizeof结构

时间:2017-03-16 11:32:40

标签: c++ gcc mingw

我遇到了mingw gcc的奇怪问题,其中sizeof(X)在以下示例中返回8而不是4:

struct X
{
      enum E {e1, e2, e3};
      uint32_t v:2;
      enum E2 {ee1, ee2, ee3};
      uint32_t vv:1;
};

如果我将其更改为

struct X
{
      enum E {e1, e2, e3};
      enum E2 {ee1, ee2, ee3};
      uint32_t v:2;
      uint32_t vv:1;
};
正如预期的那样,

结果变为4。 我知道bitfield的对齐,排序和其他东西是实现定义的,但Linux下相同的gcc 5.3给出了4个样本。
由于我的观点,枚举声明不能扩大结构的大小并影响位字段填充。那么第一次申报有什么问题呢? 这是编译命令行:

C:/Qt/Qt5.7.1/Tools/mingw530_32/bin/mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory 'C:/Users/Documents/build-tst-Desktop_Qt_5_7_1_MinGW_32bit-Release'
g++ -c -pipe -fno-keep-inline-dllexport -std=c++1z -std=gnu++1z -O2 -std=gnu++1z -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_SQL_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I..\tst -I. -I..\tst\magic_get\include -Ic://boost_1_62_0 -I..\..\..\..\Qt\Qt5.7.1\5.7\mingw53_32\include -I..\..\..\..\Qt\Qt5.7.1\5.7\mingw53_32\include\QtWidgets -I..\..\..\..\Qt\Qt5.7.1\5.7\mingw53_32\include\QtGui -I..\..\..\..\Qt\Qt5.7.1\5.7\mingw53_32\include\QtANGLE -I..\..\..\..\Qt\Qt5.7.1\5.7\mingw53_32\include\QtNetwork -I..\..\..\..\Qt\Qt5.7.1\5.7\mingw53_32\include\QtSql -I..\..\..\..\Qt\Qt5.7.1\5.7\mingw53_32\include\QtCore -Irelease -I. -I..\..\..\..\Qt\Qt5.7.1\5.7\mingw53_32\mkspecs\win32-g++  -o release\main.o ..\tst\main.cpp
g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o release\tst.exe release/main.o release/mainwindow.o release/moc_mainwindow.o  -lmingw32 -LC:\Qt\Qt5.7.1\5.7\mingw53_32\lib C:\Qt\Qt5.7.1\5.7\mingw53_32\lib\libqtmain.a -lshell32 -LC:\utils\my_sql\my_sql\lib -LC:\utils\postgresql\pgsql\lib C:\Qt\Qt5.7.1\5.7\mingw53_32\lib\libQt5Widgets.a C:\Qt\Qt5.7.1\5.7\mingw53_32\lib\libQt5Gui.a C:\Qt\Qt5.7.1\5.7\mingw53_32\lib\libQt5Network.a C:\Qt\Qt5.7.1\5.7\mingw53_32\lib\libQt5Sql.a C:\Qt\Qt5.7.1\5.7\mingw53_32\lib\libQt5Core.a 
mingw32-make[1]: Leaving directory 'C:/Users/Documents/build-tst-Desktop_Qt_5_7_1_MinGW_32bit-Release'  

可以在http://coliru.stacked-crooked.com/a/62d3a09d10fcc648找到符合预期效果的完整示例 不幸的是,我没有发现在线mingw显示出意想不到的结果。

1 个答案:

答案 0 :(得分:2)

看起来gcc的“功能”与MSVC兼容。

https://gcc.gnu.org/onlinedocs/gcc/x86-Variable-Attributes.html

请尝试

1)添加属性

struct __attribute__((gcc_struct)) X
{
      enum E {e1, e2, e3};
      uint32_t v:2;
      enum E2 {ee1, ee2, ee3};
      uint32_t vv:1;
};

2)添加编译选项-mno-ms-bitfields