LINUX.ORG.RU

Просьба подтвердить баг в Qt - QTBUG-88125 ошибка в MOC

 , ,


0

2

Добрый день.

Версия Qt с данным багом: Qt5.15.1.

Версия Qt без данного бага: Qt5.12.9.

Повторно описывать подробно не буду, если что милости прошу на страницу бага (https://bugreports.qt.io/browse/QTBUG-88125).

Если у нас есть некий производный от QObject (или другого в его иерархии) с макросом Q_OBJECT и если в данном заголовочном файле есть подключение <bsoncxx/types.hpp> (напрямую или косвенно) то будет ошибка компиляции метаобъектным компилятором Qt (MOC).

Проблема заключается в следующих строках файла <bsoncxx/types.hpp>:

enum class type : std::uint8_t {
#define BSONCXX_ENUM(name, val) k_##name = val,
#include <bsoncxx/enums/type.hpp>
#undef BSONCXX_ENUM
};

И вот содержимое <bsoncxx/enums/type.hpp>:

#ifndef BSONCXX_ENUM
#error "This header is only meant to be included as an X-macro over BSONCXX_ENUM"
#endif

BSONCXX_ENUM(double, 0x01)
BSONCXX_ENUM(utf8, 0x02)
BSONCXX_ENUM(document, 0x03)
BSONCXX_ENUM(array, 0x04)
BSONCXX_ENUM(binary, 0x05)
BSONCXX_ENUM(undefined, 0x06)
BSONCXX_ENUM(oid, 0x07)
BSONCXX_ENUM(bool, 0x08)
BSONCXX_ENUM(date, 0x09)
BSONCXX_ENUM(null, 0x0A)
BSONCXX_ENUM(regex, 0x0B)
BSONCXX_ENUM(dbpointer, 0x0C)
BSONCXX_ENUM(code, 0x0D)
BSONCXX_ENUM(symbol, 0x0E)
BSONCXX_ENUM(codewscope, 0x0F)
BSONCXX_ENUM(int32, 0x10)
BSONCXX_ENUM(timestamp, 0x11)
BSONCXX_ENUM(int64, 0x12)
BSONCXX_ENUM(decimal128, 0x13)
BSONCXX_ENUM(maxkey, 0x7F)
BSONCXX_ENUM(minkey, 0xFF)

Update 0 Временное решение

Все директивы #include для подключения заголовочных файлов библиотеки bsoncxx/mongocxx оборачивать в блоки с применением макроса Q_MOC_RUN:

#ifndef Q_MOC_RUN
// start to include the bsoncxx/mongocxx library header files
#include <bsoncxx/types.hpp>
#include <bsoncxx/array/value.hpp>
#include <bsoncxx/array/view.hpp>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/document/value.hpp>
#include <bsoncxx/document/view.hpp>
// etc
#endif

Спасибо @aol

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 7)

ошибка в MOC

мос — «это хуже чем преступление... это ошибка!» (с)

slackwarrior ★★★★★
()

У меня для тебя костылик есть )) кдешники таким не брезгают ;)

Оберни include этого хедера в #ifndef Q_MOC_RUN ))

aol ★★★★★
()
Ответ на: комментарий от aol

У меня для тебя костылик есть )) кдешники таким не брезгают ;)

Оберни include этого хедера в #ifndef Q_MOC_RUN

Спасибо. Возьму на заметку. Только возможно, что в реально используемом проекте данный заголовочный файл будет подключаться не напрямую, а косвенно, через другие заголовочные файлы из состава bsoncxx/mongocxx. Или ты к тому, что вообще все заголовочные файлы из bsoncxx/mongocxx подключать через такое условие (тогда согласен, костылик, но если нет другого выхода, придется использовать)?

Да так работает.

Тему пока не зарываю, может еще кто-нибудь что-то интересное напишет.

rumgot ★★★★★
() автор топика
Последнее исправление: rumgot (всего исправлений: 7)

И они еще пишут пространные хвалебные посты, что moc это абсолютно правильный архитектурный подход, а потом обмазывают хедеры макросней.

// Это не в твою сторону, а в сторону Qt- и KDE-разрабов.

EXL ★★★★★
()
Ответ на: комментарий от rumgot

да. обещают в 5.15 включить, если я всё правильно понял в их «тегах»..

https://code.qt.io/cgit/qt/qtbase.git/log/?qt=grep&q=88125&showmsg=1

take two.. ребята что-то не осилили сделать с первого раза.. бывает ;)

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от aol

Я когда первый раз гуглил, что-то похожее находил. Может поэтому и take two.

rumgot ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.