Windows и C++: экстерн и __ declspec (dllimport)

Каково различие/отношения между "экстерном" и "__ declspec (dllimport")? Я нашел, что иногда необходимо использовать их обоих, иногда каждый достаточно.

Я исправляю это:

  1. "экстерн" для статически связанных библиотек,
  2. "__ declspec (dllimport)" для DLL (динамически подключаемые библиотеки),
  3. оба делают на самом деле то же задание для их соответствующего типа соединения,
  4. необходимо ли использовать обоих, когда Вы пользуетесь библиотеками импорта (маленькие .lib файлы, которые помогают соединению с dll)?
22
задан liori 18 February 2010 в 11:45
поделиться

1 ответ

extern означает, что сущность имеет внешнюю связь, т.е. видна вне своей единицы трансляции (файла C или CPP). Это означает, что соответствующий символ будет помещен в объектный файл, и, следовательно, он также будет виден, если этот объектный файл станет частью статической библиотеки. Однако extern сам по себе не означает, что символ будет также виден, если объектный файл станет частью DLL.

__declspec(dllexport) означает, что символ должен быть экспортирован из DLL (если он действительно является частью DLL). Он используется при компиляции кода, который входит в DLL.

__declspec(dllimport) означает, что символ будет импортирован из DLL. Он используется при компиляции кода, который использует DLL.

Поскольку один и тот же заголовочный файл обычно используется как при компиляции самой DLL, так и клиентского кода, который будет использовать DLL, принято определять макрос, разрешающий __declspec(dllexport) при компиляции DLL и __declspec(dllimport) при компиляции ее клиента, следующим образом:

#if COMPILING_THE_DLL
    #define DLLEXTERN __declspec(dllexport)
#else
    #define DLLEXTERN __declspec(dllimport)
#endif

Чтобы ответить на ваши конкретные вопросы:

  1. Да, одного extern достаточно для статических библиотек.
  2. Да - и в объявлении также нужен extern (см. объяснение здесь).
  3. Не совсем так - см. выше.
  4. Вам не нужен extern с __declspec(dllimport) (см. объяснение по ссылке выше), но поскольку вы обычно используете один и тот же заголовочный файл, у вас уже есть extern, потому что он нужен при компиляции DLL.
35
ответ дан 29 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: