Наследование от макросов в Qt4 - PullRequest
0 голосов
/ 07 сентября 2011

Часть моего кода выглядит примерно так:

#include <QObject>
#define MYMACRO : public QObject
#define SIGNAL_MACRO Q_OBJECT signals: void testSignal(std::string s);
#define EMIT_MACRO emit testsignal(s);

class myclass MYMACRO
{
   SIGNAL_MACRO
...

void myclass::method()
{
   std::string s("string");
   EMIT_MACRO
}

Если я запишу содержимое макросов туда, где они должны быть развернуты, все будет работать нормально.Но если я сохраню макросы и позволю препроцессору выполнять работу, я получу «неопределенную ссылку на myclass :: testSignal (std :: string)».Я не понимаю, в чем разница.Препроцессор должен расширять макросы по мере их появления, точно так же, как если бы я сам их выписал.Я думал, что могу написать что-нибудь в макросе, и он будет просто скопирован туда, где это необходимо.

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Я думаю, что проблема здесь может заключаться в том, что компилятор мета-объектов Qt запускается до препроцессора C ++, поэтому он не видит Q_OBJECT внутри SIGNAL_MACRO. Из справочной документации Qt :

Инструмент moc читает заголовочный файл C ++. Если он находит один или несколько классов объявления, которые содержат макрос Q_OBJECT, он создает источник C ++ файл, содержащий мета-объектный код для этих классов.

Мой совет: не делай так.

0 голосов
/ 07 сентября 2011

Вы уверены, что когда вы пишете содержимое макросов вручную, вы пишете код, точно такой же, как код, создаваемый расширением макросов?

Мне кажется, что SIGNAL_MACRO объявляет функцию testSignal(), но не определяет ее, то есть функция не имеет тела, что, безусловно, приведет к вашей ошибке видя.

Тем не менее, по вашему коду трудно сказать, потому что использование макросов усложняет задачу. Я бы посоветовал вам не использовать макросы таким образом, потому что это делает код очень трудным для чтения и понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...