2011-11-14 91 views
0

我想從涉及宏的函數調用另一個函數。C編程:使用宏調用函數

這裏有一個例子:

#if RAND 
int functionA() { 

    //How to call the bottom function from here? 
} 


#else 
int functionA() { 


} 

通知他們都是相同的函數名。如何從'if'函數調用'else'函數。

感謝

回答

1

我不知道怎樣可以直接完成。相反,請在#if/#else之外創建一個單獨的功能,例如functionB(),然後將所有代碼從最後的functionA()移到那裏,並通過致電functionB()進行替換。然後,您可以撥打functionB()從第一個functionA()

2

你不能。根據RAND的值,編譯器僅創建其中一個函數。

0

你不知道。編譯程序時會評估預處理器宏。在這種情況下,根據編譯時RAND的值僅編譯其中一個函數。這似乎也許你想在這裏使用if語句,而不是預處理宏。

3

這沒有意義,也是不可能的。宏由預處理器處理,所以編譯器甚至不會最終看到禁用函數的代碼!

如果可以,請避免使用宏。他們欺騙你從一個聰明的編譯器中獲得好處。用盡可能多的C編寫你的代碼,而不是搜索和替換的詭計。

例如,你可以做一個功能int functionA(int type)type有條件實現不同的部位......

+0

如何使用宏不允許聰明的編譯器聰明?我不明白預處理步驟如何影響編譯器的行爲。 –

+0

當你在預處理器中編寫邏輯時,你並沒有用C編寫它,所以你沒有任何語言的工具來檢查你正在做什麼,並做出潛在的優化。這通常是一個壞主意。編譯器是你的朋友,你應該給它儘可能多的信息。 –

+2

但這沒有意義。宏的最終結果(在所有的擴展之前,它發生在編譯器之前)沒有什麼特別的關於它的C代碼。編譯器對你在宏中寫的內容以及你沒有寫的內容一無所知。 –

1

關於儘可能靠近你會得到如下的一個:

int functionA() 
{ 
    #if RAND 
    /* stuff that happens only when RAND is defined */ 
    #endif 
    /* stuff that happens whether RAND is defined or not */ 
} 

也許此:

#if RAND 
    #define FUNCA() functionA_priv() 
#else 
    #define FUNCA() functionA() 
#endif 

int FUNCA() 
{ 
    /* the non-RAND version of functionA(). 
    * It's called functionA_priv() when RAND is defined, or 
    * functionA() if it isn't */ 
} 

#if RAND 
int functionA() 
{ 
    /* The RAND version of functionA(). Only defined if RAND 
    * is defined, and calls the other version of functionA() 
    * using the name functionA_priv() via the FUNCA() macro */ 
    FUNCA(); 
} 
#endif 

在所述第二版本的使用FUNCA()宏允許的正常版本functionA()如果需要,則使用FUNCA()宏而不是functionA()遞歸地調用其自身,因爲FUNCA()將提供正確的標識符,而不管該函數使用哪個名稱。