2016-07-20 17 views
2

那麼,函數名稱只是指向函數起始地址的標籤,所以我們可以用不同的名稱鏈接一個函數嗎?作爲OpenGL API函數中的一個例子,以'gl'開頭,我們可以把它變成'GL'嗎?我有強迫症,這對我來說真的很難。是否可以使用不同的名稱鏈接一個函數

+0

你可以自己編寫「GL」函數,並從裏面調用「gl」函數。這樣你就可以使用你喜歡的名字而不會喪失功能或性能。 – nwp

+2

那麼你可以編寫一個名爲你想要它的包裝函數,然後在主體中調用'gl'函數。 – NathanOliver

+3

這是一個可怕的想法。事情有標準化的名字是有原因的。你正在談論做大量毫無意義的額外工作,可能會破壞兼容性,並導致與其他程序員的溝通混亂。生活中很多事情都很難。 –

回答

0

我找到一個更好的解決方案:

#define GLFunction(Function) gl##Function 

所以:

#define GLClearDepth GLFunction(ClearDepth) 
//... 

更愜意看到的。

2

你可以創建任何你想要的名稱函數指針和分配現有的功能對他們說:

char *(*my_strcpy)(char *, const char *) = strcpy; 

你也可以使用預處理程序如下,如果你的編譯器支持__VA_ARGS__

#define my_function(...) gl_function(__VA_ARGS__) 

後者可能更易於使用,因爲您不必知道返回類型或參數的數量和類型。

雖然您可以將上述宏定義爲非函數類型,但將其定義爲函數類型的宏將有助於防止它在您不想要的地方替換。

7

鑑於這是C++ 11,你可以輕鬆地創建一個別名,你用auto關鍵字喜歡的任何功能:

const auto Finish = glFinish; 
int main() 
{ 
    Finish(); 
} 

使用const通知不出意外將修改函數指針的編譯器/別名,你可以創建更好的代碼。

但是,沒有內置的自動化方法來「重命名」函數。除了手動維護列表之外,獲得類似結果的一種方法是查找每次OpenGL調用並進行正則表達式搜索的頁面,並替換爲(gl(.+))const auto \2 = \1;之類的模式或類似的內容。

2

您可以使用#define重命名所有功能(儘管如果您打算與其他人共享您的代碼,我會推薦而不是)。例如

#define GLClear  glClear 
#define GLDrawArrays glDrawArrays 
#define GLFinish  glFinish 
相關問題