Russian Qt Forum

Qt => Вопросы новичков => Тема начата: makar77 от Март 31, 2015, 22:46



Название: Нужна помощь по _Pragma()
Отправлено: makar77 от Март 31, 2015, 22:46
В файл .pro добавляю следующее:
Код:
DEFINES+=Q_PACKED_START=_Pragma(\"pack(push,1)\");
DEFINES+=Q_PACKED_STOP=_Pragma(\"pack(pop)\");

Например в заголовочный файл добавляю:
Код:
Q_PACKED_START
typedef struct
{
unsigned int One;
unsigned char Two;
}Any;
Q_PACKED_STOP

При сборке выдается ошибка "_Pragma takes a parenthesized string literal Q_PACKED_START"

Если сделать вот так(убрать из файла .pro макросы и добавить в заголовочный файл):
Код:
#define Q_PACKED_START _Pragma("pack(push,1)");
#define Q_PACKED_STOP _Pragma("pack(pop)");

Q_PACKED_START
typedef struct
{
unsigned int One;
unsigned char Two;
}Any;
Q_PACKED_STOP
то всё отлично!
На мой взгляд разницы никакой, а результат разный.Помогите советом (всю голову уже сломал), нужен именно первый вариант!


Название: Re: Нужна помощь по _Pragma()
Отправлено: makar77 от Апрель 01, 2015, 09:53
Как говорят "утро, вечера мудренее", ответ на мой вопрос нашелся сам, видимо из-за особенностей работы компилятора (лексического разбора make файлов) , надо в .pro файле вот так делать:
Код:
DEFINES+=Q_START_PACKED=_Pragma(\\\"pack(push,1)\\\"); 
DEFINES+=Q_STOP_PACKED=_Pragma(\\\"pack(pop)\\\");
И будет счастье! Можно спокойно макросы Q_START_PACKED и Q_STOP_PACKED применять в ваших исходниках.


Название: Re: Нужна помощь по _Pragma()
Отправлено: Пантер от Апрель 01, 2015, 09:54
Это особенности qmake скорее.


Название: Re: Нужна помощь по _Pragma()
Отправлено: makar77 от Апрель 01, 2015, 10:05
qmake создаёт нормальный make файл, без проблем:
Код:
DEFINES= -DUNICODE -DQ_START_PACKED=_Pragma("pack(push,1)"); -DQ_STOP_PACKED=_Pragma("pack(pop)"); -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN
Видимо особенность следующего этапа, на котором проводится работа с make файлом.
В консоли сборки тоже всё хорошо.


Название: Re: Нужна помощь по _Pragma()
Отправлено: Пантер от Апрель 01, 2015, 10:08
Кстати, не советую использовать названия типа Q_*, они применяются в Кьюте. Прикинь, если в следующей версии они введут такой же макрос, но он будет совершенно не то делать.