Еще можно добавить про способы упаковки структур. __attribute__ ((packed)) из gcc, не работет в Visual C++, а аналог делается через pragma. Поэтому в нашем проекте пришлось городить что типа вот этого:
# if defined(_MSC_VER)
/* __pragma() is specified starting from Visual Studio 2008*/
# if (_MSC_VER < 1500)
# error "Unsupport Visual C compiler version. Minimum version is Visual Studio 2008."
# endif
# define ATTRIBUTE_PACKED
/* Enable packing and supress warning C4103: Packing was changed after the inclusion of the header, probably missing #pragma pop */
# define BEGIN_ATTRIBUTE_PACKED __pragma(pack(push,1)) \
__pragma(warning(disable : 4103))
/* Disable packing and enable warning C4103 back */
# define END_ATTRIBUTE_PACKED __pragma(pack(pop)) \
__pragma(warning(default : 4103))
# define ATTRIBUTE_SECTION_GCC(x)
# elif defined (__GNUC__)
# define BEGIN_ATTRIBUTE_PACKED
# define END_ATTRIBUTE_PACKED
# if defined(__clang__)
# define ATTRIBUTE_PACKED __attribute__ ((packed))
# else
# define ATTRIBUTE_PACKED __attribute__ ((gcc_struct,packed))
# endif
# endif /* defined(_MSC_VER) */
При это стурктуры потом приходится определять вот таким образом:
На самом деле можно объявить и не в начале, если создать новый scope, то есть выглядить это будет что-то вроде:
Еще можно добавить про способы упаковки структур.
__attribute__ ((packed))из gcc, не работет в Visual C++, а аналог делается через pragma. Поэтому в нашем проекте пришлось городить что типа вот этого:При это стурктуры потом приходится определять вот таким образом: