__declspec
- это атрибут, специфичный для Microsoft, который позволяет указывать информацию о классе хранения.
(Уголок Нитпикера: однако, ряд других поставщиков компиляторов, например, 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
.