2013-03-02 49 views
2

我有一個程序,我正在兩個不同的編譯器上運行,並且每個編譯器都有一個不同的文件處理庫。例如在庫要求:#Define帶參數的整個函數調用?

fwrite(buffer,size,elements,file) 

而另一種是:

f_write(file,buffer,size,elements) 

反正是有,我可以在我的主頭文件使用一個全局#define一個#ifdef聲明裏面,讓我能夠無縫編譯器之間的轉換?

+0

'f_write'哈哈從哪裏開始 – 2015-11-29 18:53:00

回答

7

肯定的:

#ifdef STUPID_COMPILER 
# define fwrite(ptr, size, nitems, stream) f_write(stream, ptr, size, nitems) 
#endif 

然後,只需在代碼中使用fwrite() - 不需要包裝函數。如果您使用需要的編譯器/庫,預處理器會將其轉換爲f_write()調用。

+0

Thx,很好地工作 – PumpkinPie 2013-03-02 18:21:04

+0

也許「其他」編譯器不提供標準的實現,因此名稱的區別?不一定愚蠢,但明顯不同?順便說一句,我認爲你提供的答案是「正確」的方式來做到這一點。 – 2013-03-02 18:31:37

+0

@Josh:不,很蠢。這就是爲什麼。 – 2015-11-29 18:53:16

2

你可以做一個新的功能:

size_t my_fwrite(...) 
{ 
#ifdef REAL_FWRITE 
    return fwrite(buffer,size,elements,file); 
#elif F_WRITE 
    return f_write(file,buffer,size,elements); 
#else 
    #error "No fwrite"  
#endif 
} 

什麼樣的實現不提供fwritef_write

+0

是的,這是最好的方法,因爲它將#define封裝在一個地方。 – 2013-03-02 18:15:37

+0

我已經看到這個FAT文件系統實現。此代碼的用戶應提供一些粘連宏來將標準調用轉換爲特定的文件系統實現。這是針對在默認編譯器實現中沒有提供文件系統實現的嵌入式系統。 – 2013-03-02 18:37:23

+0

@JoshPetitt尼斯,學到了一些東西:-) – cnicutar 2013-03-02 18:38:31