Russian Qt Forum
Ноябрь 25, 2024, 08:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Q_OBJECT  (Прочитано 15299 раз)
Alexandr Az
Гость
« : Июль 24, 2008, 16:59 »

Как обернуть сабж в макрос

Скажем если сделать так
#define MYQT_DEBUG Q_OBJECT

class Test: public QObject
{
   MYQT_DEBUG
};

Получим болт при линковке, как будто макроса никакого нету...

Как вы понимаете, макрос в оригинале не такой простой
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июль 24, 2008, 17:44 »

а в конечном итоге чего добится хочешь?

может так поступить:
Код:
class Test: public QObject
{
#ifdef MY_DEBUG
   Q_OBJECT
#endif
};
« Последнее редактирование: Июль 24, 2008, 18:07 от lit-uriy » Записан

Юра.
spirit
Гость
« Ответ #2 : Июль 24, 2008, 19:15 »

Как обернуть сабж в макрос

Скажем если сделать так
#define MYQT_DEBUG Q_OBJECT

class Test: public QObject
{
   MYQT_DEBUG
};

Получим болт при линковке, как будто макроса никакого нету...

Как вы понимаете, макрос в оригинале не такой простой
имхо так не получется сделать как вы хотите, ибо moc требует явное указание имени макроса Q_OBJECT.
см.сырцы moc'a. http://www.bessrc.aps.anl.gov/software/qt4-x11-4.2.2-browser/d5/d3c/moc_8cpp-source.html
« Последнее редактирование: Июль 24, 2008, 19:17 от spirit » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Июль 24, 2008, 20:37 »

Как обернуть сабж в макрос

А зачем такой изврат? (просто интересно Улыбающийся)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Dodge
Гость
« Ответ #4 : Июль 24, 2008, 23:26 »

пожалуй никак, ибо сабжовый макрос обрабатывается мок'ом а мок вызывается перед препроцессором
Записан
Alexandr Az
Гость
« Ответ #5 : Июль 25, 2008, 10:40 »

Цитировать
может так поступить:
class Test: public QObject
{
#ifdef MY_DEBUG
   Q_OBJECT
#endif
};

В том то и дело, что так оно чичас и есть

Цитировать
А зачем такой изврат? (просто интересно Smiley)

Дело в том, что мне нужны метаданные в дебаг версии. Скажем для дебаг версии есть тулуза, которая визуализирует классы
Помимо самого Q_OBJECT в макросы куча вещей нуно запихнуть, причем разных. А то такой зоопарк в коде получается....

Цитировать
пожалуй никак, ибо сабжовый макрос обрабатывается мок'ом а мок вызывается перед препроцессором

Позволю себе здесь не согласится, ибо тогда конструкция
Код:
#ifdef MY_DEBUG
   Q_OBJECT
#endif
не обрабатывалась бы, откуда мок узнал бы о состоянии MY_DEBUG?
Записан
spirit
Гость
« Ответ #6 : Июль 25, 2008, 11:02 »

а причем MY_DEBUG к moc? просто при такой конструцкии препроцессор просто закроет Q_OBJECT и сразу получаем ошибку в консоль типа "Error: Class declarations lacks Q_OBJECT macro."
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июль 25, 2008, 13:04 »

я так представляю процесс, положим, у нас есть три файла: file-1.ui, filename.cpp/h:
1) qmake проходит по файлам указанным в pro-файле, создает make-файл в котором уже указано для какого файла надо запускать MOC
2) работа UIC -> ui_file-1.h
4) работа компилятора (препроцессор, затем копиллер) -> filename.o
5) работа MOC -> moc_filename.cpp
6) работа компилятора (препроцессор, затем копиллер) -> moc_filename.o
7) работа линкера -> *.exe (*.dll ...)

покрайней мере я так вижу последовательность действий при компиляции в консоли

т.е. qmake получается ответственный за поиск спец макросов для MOC'а и создание соответствующих команд в make-файле. И ищет он, видимо, только Q_OBJECT стоящий в начале строки, а остальное игнорит.
« Последнее редактирование: Июль 25, 2008, 13:12 от lit-uriy » Записан

Юра.
Alexandr Az
Гость
« Ответ #8 : Июль 25, 2008, 13:45 »

Цитировать
т.е. qmake получается ответственный за поиск спец макросов для MOC'а и создание соответствующих команд в make-файле. И ищет он, видимо, только Q_OBJECT стоящий в начале строки, а остальное игнорит.

Разве так важно что делает qmake?
В варианте с #ifdef для дебаг и релиз версии создаются моки (если заюзать qmake, в майк файле будет прописано мокать и релиз версию). Только в последнем случае после моканья он будет пустой.
Когда сидишь под экспресом, а он, понятное дело, не KDevelop, плевал на qmake. Моканье файлов в експресе - всего лишь прописывание в соответствующие хедеры командрую строку моканья. Да и вообще, мокать можно все подряд, плохо от этого никому не будет, просто вопрос производительности.

Следовательно, qmake реагирует тупо на слово Q_OBJECT.
Но когда мы мокаем релиз версию, где этот Q_OBJECT заключен в #ifdef, получаем пустой moc_*.cpp. Вывод, сначало предроцессор, потом моканье хедера.
Но тогда почему низя запхнуть в макрос, не понятно.....
Записан
spirit
Гость
« Ответ #9 : Июль 25, 2008, 15:03 »

ребята вы смотрели сырцы moc'a? только он парсит клбчевые слова, а следовательно и Q_OBJECT, а qmake никаким боком не парсит мета инфу, на то moc и метаобъектный компилятор.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июль 25, 2008, 15:56 »

2 Alexandr Az, ты не внимательно мой пост читал, см. п.4, а затем п.5, а затем п.6

2 spirit, еслиб qmake ничего не парсил, он бы в make-файл записал, что все надо MOC'ом обрабатывать, а в make-файле выборочно, только те, что с Q_OBJECT'ом
Записан

Юра.
spirit
Гость
« Ответ #11 : Июль 25, 2008, 16:33 »

2lit-uriy но ошибку, то возвращает moc не qmake.
строка 663 в moc.cpp.
в общем я считаю, что мы отклонились от темы.
Записан
ритт
Гость
« Ответ #12 : Июль 25, 2008, 18:57 »

а как на счёт
Код:
class Test: public QObject
{
    Q_OBJECT
    MY_DEBUG
// snip
};
если макрос MY_DEBUG должен содержать (или не содержать) какие-то декларации, которые непосредственно к объекту отношения не имеют, зачем засовывать туда Q_OBJECT?
или я чего-то не так понял?

другой вопрос: "откуда мок узнал бы о состоянии MY_DEBUG?"
всего-то и нужно что указать в .про-файле DEFINE += MY_DEBUG только для прохода мока /* ну, или не только - зависит от задачи */
Записан
SASA
Гость
« Ответ #13 : Август 11, 2008, 18:09 »

Assistant:
Цитировать
Here are the command-line options supported by the moc:
….
-D<macro>[=<def>] Define macro, with optional definition.

Так мок узнает (например из pro) о MY_DEBUG.
А для того, что бы файл успешно промокался нужно явно написать макрос Q_OBJECT.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.064 секунд. Запросов: 23.