__declspec- это специфичный для Microsoft атрибут, позволяющий указать информацию о классе хранения.
(Уголок Nitpicker's: однако ряд других поставщиков компиляторов, например GCC, теперь поддерживают это языковое расширение для совместимости с установленной базой кода, который был написан для компиляторов Microsoft. Некоторые даже предоставляют дополнительные атрибуты класса хранилища.)
Два из этих атрибутов класса хранения, которые можно указать, - это dllimportи dllexport. Они указывают компилятору, что функция или объект импортируются или экспортируются (соответственно) из DLL.
В частности, они определяют интерфейс DLL для клиента, не требуя .DEFфайла определения модуля ( ). Большинству людей гораздо проще использовать эти языковые расширения, чем создавать файлы DEF.
По понятным причинам __declspec(dllimport)и __declspec(dllexport)обычно в паре друг с другом. Вы используете, dllexportчтобы пометить символ как экспортированный из DLL, и вы используете, dllimportчтобы импортировать этот экспортированный символ в другой файл.
Из-за этого и поскольку один и тот же файл заголовка обычно используется как при компиляции DLL, так и в клиентском коде, который использует интерфейс DLL, это общий шаблон для определения макроса, который автоматически разрешается в соответствующий спецификатор атрибута во время компиляции. Например:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
Затем отметьте все символы, которые должны быть экспортированы DLLEXPORT.
Предположительно, это то, что Q_CORE_EXPORTделает макрос, разрешая либо Q_DECL_IMPORTили Q_DECL_EXPORT.