Да, конечно. Я делал это много раз. Проблемы и решения одинаковы, независимо от того, скомпилирован ли и смешан ли смешанный код, или при передаче данных в формате struct между машинами.
В старые добрые времена это часто происходило при интеграции MS C и почти всего остального: Borland Turbo C. DEC VAX C, Greenhills C.
Самая простая часть - получить количество байтов для различных типов данных для согласования. Например, short
на 32-разрядном компиляторе с одной стороны совпадает с int
на 16-разрядном компиляторе на другом конце. Поскольку общий исходный код для объявления структур, как правило, полезен, полезно использовать несколько объявлений типа «точка»:
typedef signed long s32;
typedef signed short s16;
typedef signed char s8;
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
...
Microsoft C самая раздражающая. По умолчанию он дополняет элементы до 16-битного выравнивания, а может и больше с 64-битным кодом. Другие компиляторы на x86 не дополняют членов.
struct {
int count;
char type;
char code;
char data [100];
} variable;
Может показаться, что смещение code
должно быть следующим байтом после type
, но между ними может быть вставлен дополняющий байт. Исправление обычно
#ifdef _MSC_VER // if it's any Microsoft compiler
#pragma pack(1) // byte align structure members--that is, no padding
#endif
Существует также опция командной строки компилятора, чтобы сделать то же самое.