Какой смысл в макрофункциях без replacement-list?

Я фактически никогда не сталкивался с ситуацией, когда мне приходилось бы ипользовать макрофункции. Но из любопытства, перейдя к определению Q_INVOKABLE, увидел вот что:

#define Q_INVOKABLE  QT_ANNOTATE_FUNCTION(qt_invokable)

и дальше:

#ifndef QT_ANNOTATE_FUNCTION
# define QT_ANNOTATE_FUNCTION(x)
#endif

На cppreference написано, что replacement-list является optional, да я и сам знаю, что, по крайней мере для object-like, просто будет определяться пустой макрос. Но какой в этом толк от макрофункции? Что должно дать определение?

QT_ANNOTATE_FUNCTION(qt_invokable)

Ответы (2 шт):

Автор решения: user7860670

Q_INVOKABLE, как и многие другие макросы языковых расширений QT, предназначен для обработки QT Meta-Object Compiler, который осуществляет кодогенерицию.

см https://doc.qt.io/qt-5/moc.html

→ Ссылка
Автор решения: Harry

Ну, например, есть какая-то отладочная функция.

#define DEBUG_LOG(x)  какой-то вывод в журнал

А потом в release-программе просто объявляется

#define DEBUG_LOG(x)

и все, вывод просто отключен.

→ Ссылка