В С++ есть ли способ гарантировать, что длина длинного 4 байта? Возможно, флаг компилятора для g++?
Мы повторно используем некоторый код Windows в программе Linux, и в Windows длина длинной составляет 4 байта, но на моей машине с Linux длина длины составляет 8 байтов. Мы не можем изменить все long на int, потому что это нарушит код Windows.
Причина, по которой мне нужно гарантировать, что long составляет 4 байта, заключается в том, что в некоторых частях кода у нас есть объединение структуры и массива символов, а при компиляции для 64-битного Linux массив символов не совпадает с другой структурой.
Вот несколько фрагментов кода для пояснения:
struct ABC {
unsigned long data1;
unsigned short data2;
unsigned short data3;
unsigned char data4[8];
};
//sizeof(ABC) (32 bit): 16, sizeof(ABC) (64 bit): 24
union ABC_U {
ABC abc;
unsigned char bytes[16];
};
РЕДАКТИРОВАТЬ:
Я забыл упомянуть, что эта проблема возникла только при попытке скомпилировать для 64-битной версии. Кажется, что Windows предпочитает хранить длинные 4 байта независимо от архитектуры, тогда как linux g++ обычно делает длинные того же размера, что и указатели.
Я склоняюсь к использованию uint32_t здесь, потому что эта конкретная структура не используется в коде Windows, и это не повлияет на программу глобально. Надеюсь, что нет других разделов кода, где это будет проблемой.
Я нашел флаг компилятора -mlong32, но это также заставляет указатели быть 32-битными, что нежелательно, и, поскольку это вызывает нестандартное поведение, вероятно, нарушит ABI, как упоминал PascalCuoq.