2009-11-17 67 views
14

是否可以告訴預處理器檢查函數(而不是宏)是否被聲明?我嘗試了以下方法,但看起來並不奏效:檢查函數是否用C預處理器聲明?

#include <stdio.h> 

int main(void) 
{ 
#if defined(printf) 
    printf("You support printf!\n"); 
#else 
    puts("Either you don't support printf, or this test doesn't work."); 
#endif 
    return 0; 
} 
+0

我對此很感興趣。您正在使用的庫應該是一致的,以獲得您的示例:不會有沒有printf的stdio.h,並且如果printf可能在遙遠的將來被刪除,您現在不會知道替換是如何進行的被稱爲。 – flokra 2009-11-17 14:30:31

+0

我在想這不是專門針對printf的,只是任何函數名稱。但是,如果你想知道函數是否存在,只需調用它 - 編譯器錯誤會告訴你:-) – paxdiablo 2009-11-17 14:39:52

+5

我的主要動機是檢查函數如bcopy()或arc4random()(編寫跨平臺程序時) ,這些並不總是被定義的。 – Michael 2009-11-17 14:59:39

回答

21

否。預處理器在C編譯器和C編譯器處理函數聲明之前運行。預處理器僅用於文本處理。

但是,大多數頭文件都包含一些防護宏,如_STDIO_H_,您可以在預處理程序階段中進行測試。但是,該解決方案不具有可移植性,因爲包含的警衛宏名稱不是標準化的。

0

由於預處理器不知道C/C++語言(它確實只是文本替換),所以我猜測這是不可能的。你爲什麼想這樣做?也許有另一種方式。

1

預處理器是一個簡單的程序,幾乎不知道底層語言。它不能說明是否已經聲明瞭一個函數。即使可能,函數也可能在另一個庫中定義,並且符號在鏈接期間被解析,所以預處理器在這方面不能提供幫助。

5

如果你看看像autoconf這樣的工具,你會看到他們經歷了很多測試以確定計算機有或沒有,正確編譯,然後他們設置正確的#DEFINES。

你可能想看看那個模型,如果你對unix有些味道的話,那個工具是不可能的,因爲你想做的事情是不可能的,正如其他人毫無疑問指出的那樣。

相關問題