crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в #pragma pack и __attribute__
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Анна Дата 13.4.2017, 13:19
 
Цитата(Алексей1153 @ 12.4.2017, 18:16) *
попробуй так
#ifdef Q_OS_WIN32
#define __attribute__(a)  //ничего не делаем
#endif
...

Спасибо. Интересно. Я как-то никогда не сталкивалась с такими "опустошающими" дефайнами. Во всяком случае, выглядит более наглядно. Пожалуй, попробую.

Цитата(Алексей1153 @ 12.4.2017, 18:16) *
а вообще в C++ вот так уже не модно делать:

Это не моя прихоть. Мне сказано, не трогать код для Линукса. И так приходится через чужой код с минимумом комментариев продираться.

Цитата(Алексей1153 @ 12.4.2017, 18:16) *
Анна, и вопрос - зачем тебе выравнивание на 1 байт ? Это нужно обычно в случае работы с железякой или старыми структурами, то есть там, где байты должны быть чётко на своих местах без фантазий компилятора

Именно случай с железякой.

Цитата(lanz @ 13.4.2017, 9:30) *
то что вы будете делать когда кто то будет собирать ваш код под виндой с помощью например mingw?

Такого варианта, скорей всего, не будет никогда. Разве что я сама перейду на mingw. Тогда флаг мне в руки. Я читала, что #pragma и гнутый понимает, но не гарантированно. Хотя, это всего лишь ответ с форума. На другом форуме человек пишет, что с gcc только #pragma пользуется. Не всё так однозначно... :) Опять же "не трогай чужой код"!

Цитата(lanz @ 13.4.2017, 9:30) *
Лучше использовать дефайны, определяющие компилятор, а не систему, например:
_MSC_VER
__GNUC__

Вот за это спасибо!
Ах, кто бы мне это сказал, если не добрые люди на моём любимом форуме!


Цитата(Алексей1153 @ 12.4.2017, 18:16) *
вот так моднее )

struct MyStruct
{
...
};

Кстати, сейчас вспомнила, что давненько именно такую конструкцию пробовала упаковывать и для винды и для Линукса. Там тоже очень некрасиво получалось, только не в начале, а в конце с "};" А если в структуре нужен был конструктор, то, вообще, при компиляции мат-перемат стоял. Если найду остатки экспериментов, здесь опубликую.
Алексей1153 Дата 13.4.2017, 10:16
  lanz, mingw тоже понимает #pragma pack
lanz Дата 13.4.2017, 9:30
 
Цитата
Вроде бы работает, но меня не покидает ощущение, что что-то я сделала не так, или можно было покрасивее.

Лучшее враг хорошего, но тут правда есть что улучшить, поскольку __attribute__ это специфика GCC, а pragma - студии, то что вы будете делать когда кто то будет собирать ваш код под виндой с помощью например mingw? :lol:
Лучше использовать дефайны, определяющие компилятор, а не систему, например:
_MSC_VER
__GNUC__

Хотя и gcс в общем то поддерживают прагму.
https://gcc.gnu.org/onlinedocs/gcc-4.3.1/gc...ng-Pragmas.html
Алексей1153 Дата 12.4.2017, 18:16
  попробуй так

#ifdef Q_OS_WIN32
#define __attribute__(a)  //ничего не делаем
#endif

#ifdef Q_OS_WIN32
#pragma pack(push, 1)
#endif
typedef struct __attribute__ ((packed))
{
...
}MyStruct;
#ifdef Q_OS_WIN32
#pragma pack(pop)
#endif


в линуксе это тоже какой-то дефайн, видимо



а вообще в C++ вот так уже не модно делать:
typedef struct
{
...
}MyStruct;


вот так моднее )
struct MyStruct
{
...
};


Анна, и вопрос - зачем тебе выравнивание на 1 байт ? Это нужно обычно в случае работы с железякой или старыми структурами, то есть там, где байты должны быть чётко на своих местах без фантазий компилятора
Анна Дата 12.4.2017, 14:39
  Люди, помогите, пожалуйста!

Ко мне приходят заголовочные файлы с конструкцией (человек пишет под Linux)

typedef struct __attribute__ ((packed))
{
...
}MyStruct;


Мне надо обернуть этот код конструкцией #pargma pack, чтобы собирать и под Линуксом + gcc и под виндой + MSVS. Причём конструкцию для Линукса просили не трогать.
Читала описание __attribute__, искала примеры. Везде примеры без typedef.
Поскольку пишу под Qt, то выдумала следующий код
#ifdef Q_OS_WIN32
#pragma pack(push, 1)
typedef struct
#else
typedef struct __attribute__ ((packed))
#endif
{
...
} MyStruct;
#ifdef Q_OS_WIN32
#pragma pack(pop)
#endif


Вроде бы работает, но меня не покидает ощущение, что что-то я сделала не так, или можно было покрасивее.
В том числе смущает ещё и тот момент, что в описании __attribute__ сказано, что он ставится в конце, то есть после MyStruct, но раз с "той стороны" пришла такая конструкция, то хотелось бы просто понять, почему сделано так, а не по оприсанию.

Может кто-нибудь что-нибудь предложить?
И, вообще, хотелось бы посмотреть на варианты объявления структур с упаковкой и для "того" и для "другого", с typedef и без typedef.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 12:57