2013-08-18 78 views
3

我在Visual Studio中設置了一個項目來創建.dll。我在使用關鍵字「interface」的項目中包含了一個外部庫。這是給我以下錯誤:試圖編譯.dll時,出現接口關鍵字錯誤

error C2146: syntax error : missing ';' before identifier 'INuiAudioBeam'

這些代碼行發生錯誤:

#ifndef __INuiAudioBeam_FWD_DEFINED__ 
#define __INuiAudioBeam_FWD_DEFINED__ 
typedef interface INuiAudioBeam INuiAudioBeam; //Error on this line 
#endif 

上面的代碼是我已經包含在外部庫中的頭文件的一部分。編譯時,如果不包含庫的頭文件,編譯工作將會成功完成,不會出現任何錯誤(注意:鏈接庫不會導致任何問題)。

這是什麼解決方案?是否因爲我有一個外部庫用於創建我的dll?我應該創建一個.lib而不是一個DLL?

+0

這不是C++語法,但Google說MS添加了接口關鍵字到託管C++。您可能需要告訴VS,Kinect庫以某種方式以託管C++編寫。 – idoby

+1

你是否包含'NuiApi.h'? @busy_wait託管C++中沒有'interface'關鍵字。託管C++使用'__interface'關鍵字。 C++/CLI提供了複合關鍵字「接口類」和「接口結構」。你在這裏看到的'interface'是一個COM神器。此外,Kinect系統採用本地代碼實現,並通過COM公開其服務,以便通過本地代碼和託管代碼輕鬆銷燬。 – IInspectable

+0

這是MIDL爲COM接口生成的任何.h文件中的標準輸出。我不得不猜測,您在項目中禁用了Microsoft特定的語言擴展,/ Za選項。 –

回答

3

如果任何人搜索這個,這個問題是最有可能

#define WIN32_LEAN_AND_MEAN 

之前

#include <windows.h> 

刪除定義,請確保您包括WINDOWS.H,而應該定義接口關鍵字爲你

+0

對於誰試圖使用VisualStudio構建DLL,'#define WIN32_LEAN_AND_MEAN'行位於stdafx.h文件中。只是評論它,一切都會工作。 –

1

您可以通過控制接口關鍵字來獲取C2146。關於如何定義一個關鍵字可能會引起混淆,特別是在其他編譯單元或使用相同頭文件的項目中 - 包含這些文件引發了這個問題 - 一切都很順利。然而,明顯的關鍵字「接口」仍然是一個編譯器#define指令。它恰好被埋在一個頭文件中,一些開發者有理由檢查:<objbase.h>。在那裏,它是在兩個步驟中定義:

#define __STRUCT__ struct 
#define interface __STRUCT__ 

由於<objbase.h>被多個其他頭文件包括 - 如ole2.h,oleauto.h和ATL頭擺 - 你可能會與此錯誤驚訝當前編譯單元中沒有包含這些頭文件。