Используя интеграцию Qt Visual studio, добавление нового класса Qt добавляет два отдельных файла, сгенерированных moc.exe - один для отладки и один для выпуска (и один для любой другой существующей конфигурации). Тем не менее, два окончательно сгенерированных файла кажутся идентичными.
С другой стороны, при добавлении класса пользовательского интерфейса файлы, сгенерированные uic.exe, не имеют этого разделения и являются одним и тем же файлом для всех конфигураций.
Кто-нибудь знает, зачем нужен отдельный файл moc для каждой конфигурации? В чем разница между ними?





Я предполагаю, что необходимы отдельные версии для отладки и выпуска, потому что вывод moc генерируется из исходного кода, определенного пользователем. Таким образом, вывод moc может отличаться для отладочной и отладочной сборок, если исходный код предварительно обработанного класса отличается от отладки и от выпуска (например, сигнал, который существует только в отладочной сборке).
Это не относится к файлам, сгенерированным uic, потому что они генерируются из XML .ui, который не может различаться между конфигурациями отладки и выпуска.
Moc анализирует исходный код на предмет директив препроцессора. Итак, если у вас был такой заголовочный файл:
class Test : public QObject
{
Q_OBJECT
public:
Test();
public slots:
#ifndef DEBUG
void Foo();
#endif
};
Тогда слот Foo будет существовать только в сборке выпуска, а не в сборке отладки. Moc будет генерировать разные файлы moc.cpp в зависимости от того, установлен ли символ DEBUG (в данном случае).