Здравствуйте.
Изучая потроха Qt наткнулся на такую запись:
# define Q_DECLARE_INTERFACE(IFace, IId) Q_DECLARE_INTERFACE(IFace, IId)
# define Q_DECLARE_INTERFACE(IFace, IId)
Просто вместо макроса будет подставлен он же (это используется для обработки MOC'ом, что видно из окружающего дефайна)
А если MOC не запущен (т.е. файл обрабатывает не он), то будет так:
#ifndef Q_MOC_RUN
# define Q_DECLARE_INTERFACE(IFace, IId) \
template <> inline IFace *qobject_cast_helper<IFace *>(QObject *object, IFace *) \
{ return (IFace *)(object ? object->qt_metacast(IId) : 0); } \
template <> inline IFace *qobject_cast_helper<IFace *>(const QObject *object, IFace *) \
{ return (IFace *)(object ? const_cast<QObject *>(object)->qt_metacast(IId) : 0); }
#endif // Q_MOC_RUN
#ifdef Q_MOC_RUN
# define Q_DECLARE_INTERFACE(IFace, IId)
# else
# define Q_DECLARE_INTERFACE(IFace, IId) \
bla bla bla...
#endif // Q_MOC_RUN
DIMEDROLL, когда работает препроцессор, то он вместо макроса подставлет его тело, если тела нет, то он ничего неподставит, т.е.
До препроцессора было:
#define FIRST(A, B)
#define SECOND(A, B) THERD(A, B)
// Далее по коду
FIRST(X, Y);
SECOND(X, Y)
после перпроцессора//препроцессорных директив больше нет, они разрешены
// Далее по коду
THERD(X, Y)
#ifndef Q_MOC_RUN
# define Q_DECLARE_INTERFACE(IFace, IId) \
template <> inline IFace *qobject_cast_helper<IFace *>(QObject *object, IFace *) \
{ return (IFace *)(object ? object->qt_metacast(IId) : 0); } \
template <> inline IFace *qobject_cast_helper<IFace *>(const QObject *object, IFace *) \
{ return (IFace *)(object ? const_cast<QObject *>(object)->qt_metacast(IId) : 0); }
#endif // Q_MOC_RUN
# define Q_DECLARE_INTERFACE(IFace, IId) Q_DECLARE_INTERFACE(IFace, IId)
#define MOC
#ifndef MOC
#define EQUAL(A,B) (A)==(B)
#endif
#define EQUAL(A,B) EQUAL(A,B)
void main() {
int a = 3;
int b = 3;
bool f = EQUAL(a,b);
}
//#define MOC
#ifndef MOC
#define EQUAL(A,B) (A)==(B)
#else
#define EQUAL(A,B) EQUAL(A,B)
#endif
void main() {
int a = 3;
int b = 3;
bool f = EQUAL(a,b);
}
# define Q_DECLARE_INTERFACE(IFace, IId) Q_DECLARE_INTERFACE(IFace, IId)
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)