Сумасшедшая идея: просто напишите в первую очередь программу, соответствующую C99 или C ++ 03
Я бы предложил не использовать специфичные для поставщика расширения языка C для соответствия форматам устройств или сетевых битов. Даже если вы располагаете поля для выравнивания, используя серию языковых расширений по одному поставщику, у вас все еще есть порядок байтов, о котором нужно беспокоиться, и у вас все еще есть структура структуры, для доступа к которой требуются дополнительные инструкции.
Вы можете написать соответствующую C99 программу, которая будет работать на любой архитектуре или хосте с максимальной скоростью и эффективностью кэширования, используя стандартизированные функции C API для копирования строк и памяти и функции Posix hton и ntoh.
Хорошей практикой является использование следующих функций, для которых существуют опубликованные стандарты:
C99: memcpy(), Posix: htonl(), htons(), ntohl(), ntohs()
Обновление: вот код, который должен работать везде одинаково. Возможно, вам придется получить <stdint.h>
из этого проекта , если Microsoft все еще не реализовал его для C99, или просто сделать обычные предположения о размерах int.
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <arpa/inet.h>
struct packed_with_bit_fields { // ONLY FOR COMPARISON
unsigned int a : 3;
unsigned int b : 1;
unsigned int c : 15;
unsigned int troubleMaker : 16;
unsigned short padding : 13;
} __attribute__((packed)); // USED ONLY TO COMPARE IMPLEMENTATIONS
struct unpacked { // THIS IS THE EXAMPLE STRUCT
uint32_t a;
uint32_t b;
uint32_t c;
uint32_t troubleMaker;
}; // NOTE NOT PACKED
struct unpacked su;
struct packed_with_bit_fields sp;
char *bits = "Lorem ipsum dolor";
int main(int ac, char **av) {
uint32_t x; // byte order issues ignored in both cases
// This should work with any environment and compiler
memcpy(&x, bits, 4);
su.a = x & 7;
su.b = x >> 3 & 1;
su.c = x >> 4 & 0x7fff;
memcpy(&x, bits + 2, 4);
su.troubleMaker = x >> 3 & 0xffff;
// This section works only with gcc
memcpy(&sp, bits, 6);
printf( sp.a == su.a
&& sp.b == su.b
&& sp.c == su.c
&& sp.troubleMaker == su.troubleMaker
? "conforming and gcc implementations match\n" : "huh?\n");
return 0;
}