Странный #define, требуется пояснение |
Здравствуйте, гость ( Вход | Регистрация )
Странный #define, требуется пояснение |
hkarel |
27.11.2009, 16:10
Сообщение
#1
|
Студент Группа: Участник Сообщений: 25 Регистрация: 25.5.2009 Пользователь №: 771 Спасибо сказали: 0 раз(а) Репутация: 0 |
Здравствуйте.
Изучая потроха Qt наткнулся на такую запись:
Вопрос: зачем в теле макроса повторять его наименование? Какой а этом смысл? Почему бы просто не записать
? |
|
|
Litkevich Yuriy |
27.11.2009, 18:58
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Просто вместо макроса будет подставлен он же (это используется для обработки MOC'ом, что видно из окружающего дефайна)
А если MOC не запущен (т.е. файл обрабатывает не он), то будет так:
|
|
|
DIMEDROLL |
27.11.2009, 19:17
Сообщение
#3
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
Просто вместо макроса будет подставлен он же (это используется для обработки MOC'ом, что видно из окружающего дефайна) А зачем его тогда вообще дефайнить если он уже продефайнен? Что будет если его непродефайнить? Как заработать миллион? :-) Почему не написать так:
|
|
|
niXman |
27.11.2009, 19:39
Сообщение
#4
|
Участник Группа: Участник Сообщений: 169 Регистрация: 18.6.2008 Пользователь №: 204 Спасибо сказали: 1 раз(а) Репутация: 0 |
|
|
|
Litkevich Yuriy |
27.11.2009, 20:21
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
DIMEDROLL, когда работает препроцессор, то он вместо макроса подставлет его тело, если тела нет, то он ничего неподставит, т.е.
До препроцессора было: после перпроцессора
|
|
|
DIMEDROLL |
27.11.2009, 20:32
Сообщение
#6
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
DIMEDROLL, когда работает препроцессор, то он вместо макроса подставлет его тело, если тела нет, то он ничего неподставит, т.е. Да, я представляю как работает препроцессор. Но судя по коду идет так:
Выходит что если Q_MOC_RUN НЕ определен, то получим шаблон. Если определен, то что получим? |
|
|
Litkevich Yuriy |
27.11.2009, 20:52
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
DIMEDROLL |
27.11.2009, 21:34
Сообщение
#8
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
подстановку тела макроса, а телом является строка: Q_DECLARE_INTERFACE(IFace, IId), в которую препроцессор ещё воткнёт аргументы и того получим: Q_DECLARE_INTERFACE(IFace, IId) тогда будет ошибка: идентификатор Q_DECLARE_INTERFACE не найден, вот код:
error C3861: 'EQUAL': identifier not found ошибка же и тогда если закоментировать первую строку updated: Глянул в исходниках кьют, теперь понятно макрос то был не просто обьявлен, а с ифдефом тоже:
Тоесть как правильно было сказано во втором посте, максрос
предназначен для MOC компилятора(или препроцессора, как там его называют...) Сообщение отредактировал DIMEDROLL - 27.11.2009, 21:48 |
|
|
Текстовая версия | Сейчас: 27.12.2024, 4:41 |