#pragma pack и __attribute__, и того и другого в одном флаконе! |
Здравствуйте, гость ( Вход | Регистрация )
#pragma pack и __attribute__, и того и другого в одном флаконе! |
Анна |
12.4.2017, 14:39
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Люди, помогите, пожалуйста!
Ко мне приходят заголовочные файлы с конструкцией (человек пишет под Linux)
Мне надо обернуть этот код конструкцией #pargma pack, чтобы собирать и под Линуксом + gcc и под виндой + MSVS. Причём конструкцию для Линукса просили не трогать. Читала описание __attribute__, искала примеры. Везде примеры без typedef. Поскольку пишу под Qt, то выдумала следующий код
Вроде бы работает, но меня не покидает ощущение, что что-то я сделала не так, или можно было покрасивее. В том числе смущает ещё и тот момент, что в описании __attribute__ сказано, что он ставится в конце, то есть после MyStruct, но раз с "той стороны" пришла такая конструкция, то хотелось бы просто понять, почему сделано так, а не по оприсанию. Может кто-нибудь что-нибудь предложить? И, вообще, хотелось бы посмотреть на варианты объявления структур с упаковкой и для "того" и для "другого", с typedef и без typedef. |
|
|
Алексей1153 |
12.4.2017, 18:16
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
попробуй так
в линуксе это тоже какой-то дефайн, видимо а вообще в C++ вот так уже не модно делать:
вот так моднее )
Анна, и вопрос - зачем тебе выравнивание на 1 байт ? Это нужно обычно в случае работы с железякой или старыми структурами, то есть там, где байты должны быть чётко на своих местах без фантазий компилятора Сообщение отредактировал Алексей1153 - 12.4.2017, 18:14 |
|
|
lanz |
13.4.2017, 9:30
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата Вроде бы работает, но меня не покидает ощущение, что что-то я сделала не так, или можно было покрасивее. Лучшее враг хорошего, но тут правда есть что улучшить, поскольку __attribute__ это специфика GCC, а pragma - студии, то что вы будете делать когда кто то будет собирать ваш код под виндой с помощью например mingw? Лучше использовать дефайны, определяющие компилятор, а не систему, например: _MSC_VER __GNUC__ Хотя и gcс в общем то поддерживают прагму. https://gcc.gnu.org/onlinedocs/gcc-4.3.1/gc...ng-Pragmas.html |
|
|
Алексей1153 |
13.4.2017, 10:16
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
lanz, mingw тоже понимает #pragma pack
|
|
|
Анна |
13.4.2017, 13:19
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
попробуй так
Спасибо. Интересно. Я как-то никогда не сталкивалась с такими "опустошающими" дефайнами. Во всяком случае, выглядит более наглядно. Пожалуй, попробую. а вообще в C++ вот так уже не модно делать: Это не моя прихоть. Мне сказано, не трогать код для Линукса. И так приходится через чужой код с минимумом комментариев продираться. Анна, и вопрос - зачем тебе выравнивание на 1 байт ? Это нужно обычно в случае работы с железякой или старыми структурами, то есть там, где байты должны быть чётко на своих местах без фантазий компилятора Именно случай с железякой. то что вы будете делать когда кто то будет собирать ваш код под виндой с помощью например mingw? Такого варианта, скорей всего, не будет никогда. Разве что я сама перейду на mingw. Тогда флаг мне в руки. Я читала, что #pragma и гнутый понимает, но не гарантированно. Хотя, это всего лишь ответ с форума. На другом форуме человек пишет, что с gcc только #pragma пользуется. Не всё так однозначно... Опять же "не трогай чужой код"! Лучше использовать дефайны, определяющие компилятор, а не систему, например: _MSC_VER __GNUC__ Вот за это спасибо! Ах, кто бы мне это сказал, если не добрые люди на моём любимом форуме! вот так моднее )
Кстати, сейчас вспомнила, что давненько именно такую конструкцию пробовала упаковывать и для винды и для Линукса. Там тоже очень некрасиво получалось, только не в начале, а в конце с "};" А если в структуре нужен был конструктор, то, вообще, при компиляции мат-перемат стоял. Если найду остатки экспериментов, здесь опубликую. |
|
|
Текстовая версия | Сейчас: 24.11.2024, 17:25 |