Значение ключевого слова Q_DECL_EXPORT

Q_DECL_EXPORT int main(int argc, char **argv)

Что означает это Q_DECL_EXPORT перед int main(...)?


person Tahlil    schedule 17.12.2012    source источник


Ответы (2)


Выдержка из документов QT:

В зависимости от вашей целевой платформы Qt предоставляет специальные макросы, содержащие необходимые определения:

  • Q_DECL_EXPORT необходимо добавить к объявлениям символов, используемых при компиляции разделяемой библиотеки.
  • Q_DECL_IMPORT необходимо добавить к объявлениям символов, используемых при компиляции клиента, использующего разделяемую библиотеку.

Я не проверял код QT, но, скорее всего, этот макрос будет делать следующее:

#ifdef _WIN32 || _WIN64
    #define Q_DECL_EXPORT __declspec(dllexport)
    #define Q_DECL_IMPORT __declspec(dllimport)
#else
    #define Q_DECL_EXPORT
    #define Q_DECL_IMPORT
#endif

__declspec(dllimport) и __declspec(dllexport) указывают компоновщику импортировать и экспортировать (соответственно) символ из или в DLL. Это специфично для Windows.

В вашем конкретном случае этот макрос, вероятно, можно было бы удалить, так как main() скорее всего не является частью библиотеки.

person Andrejs Cainikovs    schedule 17.12.2012
comment
Q_DECL_EXPORT main() необходим при создании приложений Qt для Android, так как собственные приложения Android загружаются в виде библиотеки из исходного кода Java. Возможно, это было похоже на Blackberry, я не знаю. - person tanius; 07.06.2020

Это не ключевое слово, это макрос для инкапсуляции различных ключевых слов, специфичных для компилятора, для объявления функции как exported.

См. также Q_DECL_EXPORT и Создание общих библиотек.

Обычно он используется с библиотеками для определения тех функций, которые необходимо экспортировать из библиотеки, чтобы их можно было импортировать («использовать») другими библиотеками или исполняемыми файлами.

До сих пор я не видел такого с функцией main, но это может быть особенностью Blackberry. С другой стороны, это руководство не используйте макрос с функцией main(), поэтому его, вероятно, можно удалить.

person Andreas Fester    schedule 17.12.2012