Что делает макрос Q_OBJECT? Почему всем спокойным объектам нужен этот макрос?

Проблема здесь:

scanf("%99[^.]", msg);

Это утверждение читает до 99 символов, но только до следующего несоответствующего символа. Теперь, если вы поставите

Привет, господин его!.

во входном буфере, у вас действительно есть

"Hello mister him!.\n"

в буфере входного потока stdin. Теперь scanf обрабатывает все, вплоть до (но не включая) точки, поэтому точка и символ новой строки остаются во входном буфере. Следующий вызов scanf()

scanf("%s", to);

теперь выбирает точку и символ новой строки из буфера вывода, который автоматически завершает следующую строку для чтения. Теперь входной буфер пуст и следующий scanf ожидает следующего сообщения.

Чтобы исправить это, вы можете пропустить точку и новую строку следующим образом:

scanf("%99[^.]", msg);
getchar(); // Pacman (Eat the dot)

, а в другом scanf используйте

// scanf(" %s", to); // Skip the preceding newline

( как указал HS, в этом нет необходимости.

Обратите внимание, что случай ввода сообщения> 99 символов еще не обработан должным образом.

124
задан Reinstate Monica 7 April 2016 в 20:37
поделиться

3 ответа

Из документации Qt :

The Meta- Компилятор объектов, moc, программа, которая обрабатывает Qt C ++ расширения.

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

129
ответ дан 24 November 2019 в 01:08
поделиться

В gcc с -E Вы видите расширенные макросы. Это - то, во что Q_OBJECT расширяется на gcc на Linux. Знайте, это могло бы быть зависимым платформы, и он мог бы измениться в зависимости от версии QT. Вы видите, что это не просто тег для компилятора MOC.

# 11 "mainwindow.hh"
#pragma GCC diagnostic push
# 11 "mainwindow.hh"

# 11 "mainwindow.hh"
#pragma GCC diagnostic ignored "-Wsuggest-override"
# 11 "mainwindow.hh"
    static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, cons
t char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private:
# 11 "mainwindow.hh"
#pragma GCC diagnostic ignored "-Wattributes"
# 11 "mainwindow.hh"
    __attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
# 11 "mainwindow.hh"
#pragma GCC diagnostic pop
# 11 "mainwindow.hh"
    struct QPrivateSignal {};
1
ответ дан 24 November 2019 в 01:08
поделиться

Он просто сообщает предварительно компилятор, что этот класс имеет элементы графического интерфейса и должен запускаться через 'moc', вам нужно только добавить это в классы, которые используют механизм сигнала / слота.
Но это будет незаметно игнорироваться в любых других классах - это просто увеличивает время сборки.

17
ответ дан 24 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: