我想從涉及宏的函數調用另一個函數。C編程:使用宏調用函數
這裏有一個例子:
#if RAND
int functionA() {
//How to call the bottom function from here?
}
#else
int functionA() {
}
通知他們都是相同的函數名。如何從'if'函數調用'else'函數。
感謝
我想從涉及宏的函數調用另一個函數。C編程:使用宏調用函數
這裏有一個例子:
#if RAND
int functionA() {
//How to call the bottom function from here?
}
#else
int functionA() {
}
通知他們都是相同的函數名。如何從'if'函數調用'else'函數。
感謝
我不知道怎樣可以直接完成。相反,請在#if/#else
之外創建一個單獨的功能,例如functionB()
,然後將所有代碼從最後的functionA()
移到那裏,並通過致電functionB()
進行替換。然後,您可以撥打functionB()
從第一個functionA()
。
你不能。根據RAND
的值,編譯器僅創建其中一個函數。
你不知道。編譯程序時會評估預處理器宏。在這種情況下,根據編譯時RAND
的值僅編譯其中一個函數。這似乎也許你想在這裏使用if語句,而不是預處理宏。
這沒有意義,也是不可能的。宏由預處理器處理,所以編譯器甚至不會最終看到禁用函數的代碼!
如果可以,請避免使用宏。他們欺騙你從一個聰明的編譯器中獲得好處。用盡可能多的C編寫你的代碼,而不是搜索和替換的詭計。
例如,你可以做一個功能int functionA(int type)
和type
有條件實現不同的部位......
關於儘可能靠近你會得到如下的一個:
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()
將提供正確的標識符,而不管該函數使用哪個名稱。
如何使用宏不允許聰明的編譯器聰明?我不明白預處理步驟如何影響編譯器的行爲。 –
當你在預處理器中編寫邏輯時,你並沒有用C編寫它,所以你沒有任何語言的工具來檢查你正在做什麼,並做出潛在的優化。這通常是一個壞主意。編譯器是你的朋友,你應該給它儘可能多的信息。 –
但這沒有意義。宏的最終結果(在所有的擴展之前,它發生在編譯器之前)沒有什麼特別的關於它的C代碼。編譯器對你在宏中寫的內容以及你沒有寫的內容一無所知。 –