2013-09-24 3 views
1

Je crée une DLL C++ à importer dans vb.net.Où puis-je créer des directives de préprocesseur pour une exportation dll?

J'ai trouvé que la meilleure façon d'organiser les importations et les exportations dans le fichier d'en-tête de la dll, est quelque chose du type:

#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 

Ma question est, où sont les __cplusplus et MY_DLL_EXPORTS supposé à définir ?

Je ne l'ai pas fait auparavant et je n'arrive pas à trouver une place dans le code pour cela. J'ai lu quelque chose à mettre ces définitions dans le

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

Est-ce que je les mets dans les propriétés du projet de la DLL? et si je le fais, en utilisant cette DLL, seront-ils toujours définis de sorte que l'instruction if ira toujours au dllimport?

Est-ce que __cplusplus est déjà défini ou dois-je le définir?

Répondre

1

__cplusplus est défini pour vous par un compilateur C++, mais PAS par un compilateur C. C'est ainsi que vous pouvez déterminer si votre code est compilé par un compilateur C ou C++. C'est pourquoi cela est utilisé pour protéger la construction extern "C". Un compilateur C l'omettrait simplement (puisqu'il émet déjà un lien C).

Les autres constantes peuvent être définies soit sur la ligne de commande du compilateur, ou dans le code quelque part (par exemple dans le menu que vous avez énumérés.):

#define MY_DLL_EXPORTS 
+0

ne serait pas le fait que je définis dans le code, ou sur la ligne de commande, rendre le #ifdef inutile - puisque la directive sera toujours définie? – Thalia

+0

J'ai finalement compris comment cela fonctionne, la directive du préprocesseur n'est pas définie du tout puisque j'utilise ce code de dot net. Il serait cependant défini dans un projet C++ appelant. – Thalia

+0

@Thalia, vous l'utilisez comme un commutateur pour contrôler votre code sans le changer manuellement. Un autre exemple est la constante 'DEBUG'. Vous pouvez pepper votre code avec des instructions de débogage puis les ignorer avec un seul commutateur '# define', en ligne de commande, ou en passant de Debug à Release. – Adam

1

Le meilleur endroit pour définir COMPILING_DLL est la ligne de commande du compilateur. Si vous utilisez Visual Studio IDE, il est dans les propriétés du projet ... C/C++ ... Préprocesseur ... Définitions du préprocesseur.

__declspec (dllimport) est une extension spécifique à Microsoft pour C++. Microsoft a une excellente documentation en ligne.

Questions connexes