我遇到了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显示出意想不到的结果。
答案 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