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