2013-09-24 31 views
1

我正在創建一個C++ dll以在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已經定義或者我必須定義呢?以限定COMPILING_DLL

回答

1

__cplusplus由C++編譯器爲你定義,而不是由一個C編譯器。這是如何確定您的代碼是由C或C++編譯器編譯的。這就是爲什麼這是用來防範extern "C"結構。 C編譯器會忽略它(因爲它已經發出C鏈接)。

的其他常量可以在編譯器的命令行上任何定義,或者在某個地方的代碼(例如,在菜單中列出):

#define MY_DLL_EXPORTS 
+0

會不是事實,我在代碼中定義它,或者在命令行上,儘管#ifdef沒有意義 - 因爲指令總是被定義的? – Thalia

+0

我終於明白這是如何工作的,預處理器指令IS NOT DEFINED AT ALL,因爲我使用的是網點代碼。它會在調用C++項目中定義。 – Thalia

+0

@Thalia,你可以使用它作爲開關來控制你的代碼而不需要手動改變它。另一個例子是DEBUG常量。您可以用調試語句胡說你的代碼,然後用一個'#define',命令行開關或者從Debug到Release來忽略它們。 – Adam

1

最好的地方是編譯器的命令行。如果您使用Visual Studio IDE,那麼它在項目屬性中... C/C++ ...預處理器...預處理器定義。

__declspec(dllimport的)是微軟特定擴展到C++。微軟擁有出色的在線文檔。