2013-04-04 86 views
8

我最近在別人的opengl着色器類中遇到過這種代碼,我不確定它的用法。C++預處理器在類關鍵字和類名前定義

正如我從閱讀IBM's documentation所瞭解的那樣,#define ONEWORD將在隨後的文本中刪除ONEWORD的任何出現。

如果所有的事件都被刪除,那麼在這段代碼中有ONEWORD的目的是什麼?在類關鍵字之後但在類名之前有這樣的標記真的意味着什麼?
我以前只使用#define作爲包括守衛,所以這對我來說是全新的。

#define ONEWORD 

class ONEWORD FooClass 
{ 
    FooClass(); 
    ~FooClass(); 
}; 

我看到這個中的代碼是在這裏:https://dl.dropbox.com/u/104992465/glsl.h
以防萬一,我做了它的上下文過於抽象。

+1

我經常見到兩條腿的動物走進一些神祕的方形圍欄,那是什麼? [好吧,我自己回答,是關於刪除關於我觀察到的關鍵信息,並概括我自己的印象,然後詢問有關情況。] – 2013-04-04 06:31:45

回答

4

哦,所以在看實際代碼後,它不是ONEWORD,而是GLSAPI。這些宏常常用於有條件地指定特定於平臺的鏈接,例如某些__attributes__,它們需要對例如Windows和Unix進行不同的處理。

#ifdef WIN32 
# define GLSAPI __dllimport 
#elif defined __linux__ 
# define GLSAPI __attribute__((visibility("visible"))) 
#else 
# define GLSAPI 
#endif 

(僞代碼,我不知道有關的所有屬性和聯動「預選賽」,但是:所以你可以期待GLSAPI在頭文件(也許在config.h)這樣的一個定義你可以在代碼中查找它們。)

+1

#else if line是可疑的。 – 2013-04-04 06:24:14

+0

在實際的代碼中,它沒有像這樣定義。只是'#define GLSAPI'這行# – maditya 2013-04-04 06:24:44

+0

@maditya我不是說它是如何被定義的,我試圖解釋它是如何被定義的,這是什麼原因。 – 2013-04-04 06:27:46

5

它允許您輕鬆地將編譯器特定的關鍵字添加到您的類聲明中。例如與Visual Studio,如果你希望把這個類在DLL中,你將你的定義修改爲

#define ONEWORD __declspec(dllexport) 

here再如