2014-10-03 34 views
0

我想爲特定情況生成編譯器警告。我正在構建一種基於幾個預編譯器定義構建的通用代碼。例如,我可能有類似以下的內容。C - 當調用鬆散定義函數時產生警告


sdcard.h

#ifdef PART_BOARD1 
    #include "port/board1.h" 
#elif PART_BOARD2 
    #include "port/board2.h" 
#endif 

extern void sdcardConfigure(void); 

sdcard.c

#ifndef FLAG_SDCARD 
    #warning "No SD Card available for this board, or this board has not been defined" 
    #define sdcardConfigure(...) void(0) 
#endif 

端口/ board1.h(端口/ board2類似)

#define FLAG_SDCARD 
void sdcardConfigure(void); 

端口/ board1.c

void sdcardConfigure(void) { 
    // sd card is configured here 
} 

基本上我想要做的就是修改#define sdcardConfigure(...)聲明sdcard.c讓我只看到,如果警告消息實際上調用了sdcardConfigure()。使得它像:

void sdcardConfigure(void) { 
    #warning "sdcardConfigure() not available on this board" 
} 

的想法是,這給了我靈活地創建一個通用的(我知道很多人擔心通用)程序,它適應的是它使用的部分。 I.E.如果有SD卡使用它,否則產生一個警告「你正在調用這個部分不存在的函數」,並讓開發者決定是否需要這個函數。

+0

什麼編譯器? – 2014-10-03 14:07:38

+0

gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1) – user3817250 2014-10-03 14:19:28

+0

確定 - 請參閱下面的答案 - 我還爲該問題添加了「gcc」標記。 – 2014-10-03 14:22:44

回答

1

對此的回答很可能是編譯器依賴的。

對於gcc等您可以使用__attribute__ ((deprecated))see gcc manual)。

對於Visual Studio,您可以使用__declspec(deprecated)

+0

謝謝。 '不推薦'讓我措手不及,我認爲'__attribute__'已被棄用,但是已被棄用的'__attribute__'。 我現在有'void sdcardConfigure(void)__attribute __((不贊成(「sdcardConfigure unavailable」)));'作爲聲明(如果沒有提供FLAG_SDCARD)。這基本上完全是我想要的。唯一的問題是警告信息有點令人困惑,因爲該功能並沒有被逐漸淘汰。 – user3817250 2014-10-03 14:34:55

+0

是的,它不是很理想 - 很遺憾,您不能向已棄用的警告添加合適的消息 - 但我認爲這可能是您可以做的最好的選擇,只要在編譯調用該函數時發出警告即可。 – 2014-10-03 14:48:39

相關問題