Следующий код можно скомпилировать в Visual C++. Мне это нравится, и это мило!
#include <stdio.h>
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4201)
#pragma pack(push,1)
#define PACKED
#else
#define PACKED __attribute__ ((__packed__))
#endif
union A {
struct {
int a:1;
int b:2;
int c1:29;
}PACKED;
struct {
int a:1;
int b:2;
int c2:28;
int d:1;
}PACKED;
int val;
}PACKED;
#ifdef _MSC_VER
#pragma pack(pop)
#pragma warning(pop)
#endif
#undef PACKED
int main(){
A test;
test.val = 0x1078FFF7;
printf("sizeof(A): %d, test.a: %d.\n", sizeof(A), test.a);
return -1;
}
Вывод с файлом, созданным с помощью MSC:
sizeof(A): 4, test.a: -1.
Но в GCC, включая последний gcc-7, он не смог скомпилироваться, :(
struct.cpp:13:15: error: redeclaration of ‘signed char:1 A::<unnamed struct>::a
int a:1;
^
struct.cpp:7:15: note: previous declaration ‘signed char:1 A::<unnamed struct>::a
int a:1;
^
struct.cpp:14:15: error: redeclaration of ‘signed char:2 A::<unnamed struct>::b
int b:2;
^
struct.cpp:8:15: note: previous declaration ‘signed char:2 A::<unnamed struct>::b
int b:2;
^
Это ошибка в GCC?
Спасибо за ваши комментарии, я просто понял, что этот вопрос может быть недействительным для C;Но для части C++ я все еще беспокоюсь.Лично мне нравится компиляция Visual C++, она может сохранить тонны кода в моем сценарии