что означает __declspec (dllimport)?

Я видел исходный код Qt следующим образом:

class Q_CORE_EXPORT QBasicAtomicInt { public: ... }; 

Какой макрос Q_CORE_EXPORT определяется следующим образом:

 define Q_DECL_IMPORT __declspec(dllimport) 

Так что же означает __declspec(dllimport) ?

__declspec – это специфический для Microsoft атрибут, который позволяет указать информацию о classе хранения.
(Nitpicker’s Corner: Однако ряд других поставщиков компиляторов, например GCC, теперь поддерживают это языковое расширение для совместимости с установленной базой кода, написанной с таргетингом на компиляторы Microsoft. Некоторые даже предоставляют дополнительные атрибуты classа хранения.)

Два из этих атрибутов classа хранения, которые могут быть указаны, – 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_CORE_EXPORT , разрешая либо Q_DECL_IMPORT либо Q_DECL_EXPORT .

__declspec(dllimport) – спецификатор classа хранения, который сообщает компилятору, что функция или объект или тип данных определены во внешней DLL.

Функция или объект или тип данных экспортируются из DLL с соответствующим __declspec(dllexport) .

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

  • Экспорт функций из DLL с помощью dllexport
  • Как определить, является ли строка числом с C ++?
  • Почему std :: vector :: operator от 5 до 10 раз быстрее, чем std :: vector :: at ()?
  • постоянные переменные, не работающие в заголовке
  • Как преобразовать char * в LPCWSTR?
  • Печать значений всех полей в структуре C ++
  • Установка внутреннего буфера, используемого стандартным streamом (pubsetbuf)
  • В C ++ / CLI, что делает символ шляпы?
  • О развитии векторов
  • Что происходит с тем, что происходит с памятью с памятью std :: deque?
  • Установка OpenCV 2.4.3 в Visual C ++ 2010 Express
  • Interesting Posts

    Отключить приглашение администратора сервера Mac OS X?

    Как использовать метод экземпляра как обратный вызов для функции, которая принимает только func или буквальное закрытие

    Завершение истории oh-my-zsh

    Имеет ли ключевое слово «изменчивое» какие-либо цели, кроме возможности изменять переменную функцией const?

    Где находятся каталоги профиля пользователя Google Chrome?

    Скрыть раздел из Windows 10 для предотвращения проблем с гибридным отключением в Linux

    Строковые литералы: куда они идут?

    n-е уродливое число

    В XSLT как вы проверяете, существует ли переменная?

    Использование регулярных выражений для анализа HTML: почему бы и нет?

    TextView Marquee не работает

    Включить только * .cs файлы с помощью 7zip GUI

    Добавление двух рядов с NaN

    Как развернуть Java-апплет для современных браузеров (апплет, встраивание, объект)?

    Как применить непрозрачность к цветовой переменной CSS?

    Давайте будем гением компьютера.