2013-07-04 73 views
2

我正在使用現有的C++代碼,它使用的是一種API。 在瀏覽代碼時,我發現了一個我第一次看到的奇怪的語法,我無法弄清楚它的功能或調用方式。C++ - 類聲明(宏)中的兩個名稱[解決]

它是這樣的:foobar的後

class KINDA_API foobar : public foo { 
    // Some class declarations 
}; 

一切都是可以理解我。但是,什麼意思是KINDA_API?這是做什麼的?這是任何一種先進的派生或類似的東西? 也許有其他任何主題,回答這個,我也搜索了,但我甚至不知道這是怎麼叫^^」提前:)

+7

這可能是一個宏;你是否在源代碼中搜索了一個定義? –

+0

順便說一句,一旦你接受了一個答案,就不需要'[解析過的]'標記了 - 這可以在問題列表中看到。 – arne

+0

啊,好的。這是我在這裏的第一個問題^^我會離開它就像現在,但要記住下一次:) – Tygaz

回答

5

通常當你以這種具體的方式看到OMGWFT_API聲明,這是一個「神奇的開關」在正確的「模式」構建庫:

  • 靜態鏈接 - OMGWFT_API用 「」(空字符串)
  • 動態鏈接替代 - DLL - OMGWFT_API由declspec(DLLEXPORT)代替
  • 動態鏈接 - EXE - OMGWFT_API由declspec(dllimport的)代替

#ifdef BUILD_ME_AS_STATICLIB 
#define OMGWFT_API 
#else 
#ifdef BUILD_ME_AS_DLL 
#define OMGWFT_API declspec(dllexport) 
#else 
#define OMGWFT_API declspec(dllimport) 
#endif 
#endif 

這當然只是示例的草圖,但我認爲你現在明白了吧。關鍵字取自MSVC而不是GCC <,因爲我偶然碰巧記得它們。

「BUILD_ME_AS ....」宏將通過項目選項或-D命令行開關進行定義。

但是,它可以設置OMGWFT_API有任何意義,所以一定要grep /搜索一個#define來設置它。

+0

這與我在代碼中發現的完全一樣:)這說明它非常好。非常感謝你! – Tygaz

3

謝謝,我想這是一個#define -d在編譯之前執行一些「魔術」的宏。

+0

哇,你們回答得非常快,我甚至沒有時間迴應查爾斯...是的,這似乎是,非常感謝你! – Tygaz

1

如果你通過現有的叫你很可能會發現類似的財產以後:

#ifdef _WIN32 
#define KINDA_API <windows specific attribute> 
#elif __linux 
#define KINDA_API <linux specific attribute> 

等等

這些宏更容易調節的編譯器和/或它們的版本,而不是操作系統,但你的想法...