#pragma pack(1)

Доброе время суток.Итак. Имеется следующя проблема. Заголовочный файл:
#pragma pack(push)#pragma pack(1)namespace aaa{struct FFF{unsigned int a:8;unsigned int b:8;unsigned int c:8;public: FFF(void);}};#pragma pack(pop)
Мне надо, чтоб структура занимала жестко 3 байта (идет завязка с пакетом от контроллера на девайсе), но pragma не помогает. Т.е. в данном случае ее размер = 4...Есть и другие структуры в описании у них также. Где-то на 2, где-то на 3 байта размер больше.Смотрел МСДН, #pragma pack(show) показывает 1. Пробовал ********** само объявление структуры в #pragma pack эффект такой же. Выносил в CPP файл (директивы прагма) - аналогично.Как это победить?Работаю в Студии 2005.
11 ответов

За область вылезает ввиду наличия unsigned int. unsigned short int не помогает, а мне нужно именно число и именно из одного байта.В студии есть __int8, но его использование, как я понимаю, не дает кросплатформенности, что тоже надо учесть.


В студии есть __int8, но его использование, как я понимаю, не дает кросплатформенности
а char чем не подходит?


Простите, немного оффтопика. А что означает двоеточия здесь:
unsigned int a<span>:</span>8;


Простите, немного оффтопика. А что означает двоеточия здесь:
Цитата(Mal Hack @  17.7.2008,  23:24 )
unsigned int a<span>:</span>8;
Количество бит, отведенное под переменную. В данном случае - 8. Но можно сделать и 1, и 14...


Эм... Мне стыдно, но что-то меня глюкануло в плане возможности char a = 10; =)Спасибо... Зате теперь буду хорошо знать как #pragma pack пользоваться =)Спасибо.Добавлено через 57 секунд
Количество бит, отведенное под переменную. В данном случае - 8. Но можно сделать и 1, и 14... 
Не помогало. Проверял. Ставил три поля по 2 бита, т.к. по логике все влезть в 1 байт должно было, ан нет, 4...Добавлено через 2 минуты и 44 секундыUlysses4j,  http://www.citforum.ru/programming/cpp_march/cpp_066.shtml


попробуй так
struct {...} __attribute__ ((packed));


__attribute__ ((packed));
Что это? =)


В студии есть __int8, но его использование, как я понимаю, не дает кросплатформенности
А pragma pack даёт кросплатформенность?  


UnrealMan, наиболее распространенные компиляторы ее поддерживают.


А pragma pack даёт кросплатформенность?  
Вообще-то нет, конечно. Но в Википедии написано, что все основные компиляторы ее поддерживают (gcc, MS, Borland). Иногда упаковка очень желательна: если, например, структуры сериализовывать в сокет. На другом конце может быть вообще не C++ и об упаковках ничего не знать. Я писал как-то клиент на C++, сервер на Java. Если б не было упаковки, на Java бы я забадался нужные байты выкусывать.


Не помогало. Проверял. Ставил три поля по 2 бита, т.к. по логике все влезть в 1 байт должно было, ан нет, 4...
Так ясное дело, если ты пишешь на x32 платформе unsigned int, то оно в любом случае будет 4 байта. Даже если ты используешь первые 24 бита, а остальные 8 тебе ненужны, компилятор транслирует структуру в 4 байта, а при ображении к элементам будет сдвигать этот unsigned int на n бит.