Существует общая проблема с предыдущим решением, оно недопустимо при использовании Qt. Процесс moc'ing не использует препроцессор, и пространство имен не используется (что приводит к ошибке времени компиляции).
Одним из возможных решений было бы использование #define QT_NAMESPACE lib_namespace
, но оно переместило бы весь Qt в это пространство имен.
Следующее решение носит более общий характер (я сохранил название макроса для удобства):
#ifndef DOXY_PARSER
#define LIB_NAMESPACE lib_namespace
#define LIB_NAMESPACE_STARTS namespace LIB_NAMESPACE { /##/
#if (defined MOCED_FILE)
#define LIB_NAMESPACE_ENDS } using namespace LIB_NAMESPACE; /##/
#else
#define LIB_NAMESPACE_ENDS } /##/
#endif
#define USING_LIB_NAMESPACE using namespace LIB_NAMESPACE; /##/
#else
#define LIB_NAMESPACE_STARTS /##/
#define LIB_NAMESPACE_ENDS /##/
#define LIB_NAMESPACE
#define USING_LIB_NAMESPACE /##/
#endif
Где MOCED_FILE
- это исключение для mocs. Если вы используете CMake, вы можете указать такую опцию, используя:
QT4_WRAP_CPP(mocSources qt_file1.h qt_file2.h)
SET_SOURCE_FILES_PROPERTIES(${mocSources} PROPERTIES COMPILE_FLAGS "-DMOCED_FILE")