比如說,我有幾個函式的宣告,應該在幾個庫檔案中執行類似的動作:
// file0.h
void delay_ms0(unsigned int)。
//file1.h
void delay_ms1(int);
//file2.h
extern void delay_ms2(int);
//file3.h
int delay_ms3(unsigned int) ;
//file4.h
void delay_ms4(unsigned char);
//file5.h
void delay_us(unsigned long)。
//file6.h
void delay_ms6(const int *)/span>;
//file7.h
// (在某些情況下,結構用于傳遞幾個函式)
typedef void (*const delay_fptr_t)(int)。
extern delay_fptr_t delay_ms7;
而在我的主應用程式中,我有實際的定義,有特定平臺的實作:
// main.c
void delay_ms(unsigned int time_ms) { platform_shutdown(time_ms*128) 。};
因此,問題是。是否有可能在不使用編譯程式中的額外指令的情況下將它們中的一些或全部指向同一個實作,即以某種方式指示編譯器或聯結器將函式呼叫發送到哪里。特別是說到GCC。 如果是這樣的話,開發和集成庫就會更方便了......
目前,標準答案是否定的。
目前,標準的解決方案通常是這樣的:
// main.c
//這些是額外的函式呼叫,并不總是被優化掉。消耗了RAM和ROM。
void delay_ms0(unsigned int val) { delay_ms(val); };
void delay_ms1(int) type">int val) { delay_ms((unsigned int) val)。) };
//有些地方總是不能正確鏈接,所以在運行時呼叫時,會導致硬故障,或者什么都沒有發生。
inline void delay2(int val) { delay_ms((unsigned int) val) 。};
//最可能是沒有辦法的,因為我們必須回傳一些東西。
int delay_ms3(unsigned int) { delay_ms((unsigned int) val) 。return 0; };
//很可能沒有辦法,因為'c_val'必須被擴展。
void delay_ms4(unsigned char c_val) { delay_ms((unsigned int) c_val) 。};
//最可能是沒有辦法的,因為'll_val'必須在進一步傳遞之前進行處理。
void delay_us(unsigned long long ll_val) { delay_ms((unsigned int) ll_val/1000) 。};
//很可能沒有辦法,因為'p_val'必須被解除參考。
void delay_ms6(const int *p_val) { delay_ms((unsigned int) *p_val) 。};
//這是我目前最喜歡的,因為它不使用額外的RAM,并允許一些松懈,當函式定義不完全匹配時,但它肯定使用ROM來存盤指標。
delay_fptr_t delay_ms7=(delay_fptr_t)delay_ms。
// I would like to see something like that^, but for standard declarations.
// I.e. 是否有任何替代方案:
void (*delay2_ms)(int) = delay_ms; //gcc error: 'delay2_ms' 重新宣告為不同種類的符號。
uj5u.com熱心網友回復:
是的,這是有可能的。直接的方法是使用alias屬性(見GCC檔案)。一個小小的例子:
int some(int x) {
return 2*x;
}
int more(int) type">int y) __attribute__((alias("some"))。
現在,some和more是同一個函式。
但是請注意,你必須確保呼叫慣例是相同的。這應該是非常明顯的,因為否則,將必須有一些轉換代碼(仍然,在許多情況下,包裝器歸結為幾條指令,以JMP結束[或等同;除非你調整回傳值或同樣],這不應該增加太多的用于連接庫的蹦蹦跳跳)。
然而,如果你真的關心性能,你可以考慮使用鏈接時優化。它現在被GCC所支持;在檔案中搜索-flto。(簡而言之:在編譯和鏈接時,將-flto傳遞給GCC)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315448.html
標籤:
