2013-09-24 3 views
1

Я создаю dll C++ для импорта в vb.net.Где я могу создать директивы препроцессора для экспорта dll?

Я обнаружил, что лучший способ организовать импорт и экспорт в файл заголовка DLL, это что-то типа:

#ifndef MY_DLL_EXPORTS 
    #define MY_DLL_EXPORT __declspec(dllexport) 
#else 
    #define MY_DLL_EXPORT __declspec(dllimport) 
#endif 

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

    MY_DLL_EXPORT BOOL my_function(uint32_t x); 

#ifdef __cplusplus 
} 
#endif 

Мой вопрос, где же __cplusplus и MY_DLL_EXPORTS предполагается быть определенным ?

Я не делал этого раньше, и я не могу найти место в коде для него. Я прочитал что-то о том, чтобы поместить эти определения в

Project Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions 

Я поместил их в свойства проекта DLL? и если я это сделаю, то при использовании этой DLL они всегда будут определены, поэтому оператор if всегда будет обращаться к dllimport?

Также есть __cplusplus, который я определил или должен определить?

ответ

1

__cplusplus определен для вас компилятором C++, но НЕ компилятором C. Вот как вы можете определить, компилируется ли ваш код компилятором C или C++. Вот почему это используется для защиты конструкции extern "C". Компилятор C просто опустил бы его (поскольку он уже испускает C-ссылку).

других констант может быть либо определен в командной строке компилятора, или в коде где-нибудь (например, в меню в списке.):

#define MY_DLL_EXPORTS 
+0

бы не тот факт, что я определяю его в коде, или в командной строке, сделать #ifdef бессмысленным - поскольку директива всегда будет определена? – Thalia

+0

Я наконец понял, как это работает, директива препроцессора НЕ ОПРЕДЕЛЕНА ВСЕ, поскольку я использую этот код из сети точек. Однако он будет определен в вызывающем проекте C++. – Thalia

+0

@Thalia, вы используете его как переключатель для управления кодом без его ручной смены. Другим примером является константа 'DEBUG'. Вы можете перенести свой код с помощью отладочных инструкций, а затем проигнорировать их одним синтаксисом '# define', командной строки или перейти от Debug to Release. – Adam

1

Лучшее место для определения COMPILLING_DLL - это командная строка компилятора. Если вы используете Visual Studio IDE, то он находится в свойствах проекта ... C/C++ ... Препроцессор ... Определения препроцессора.

__declspec (dllimport) - это специальное расширение Microsoft для C++. Microsoft имеет отличную онлайн-документацию.