2013-04-20 96 views
7

的函數指針的定義通常的形式是:函數指針聲明 - __P做什麼?

int function(int, int); 
int (*ptr)(int, int); 

,但我看到了一個形式,今天我不明白。任何人都可以解釋這個嗎?

int (*close) __P((struct __db *)); 
+0

這是C還是C++? (請以任何方式將標籤添加到問題中)。你知道'__P'宏是什麼嗎? – Rup 2013-04-20 16:19:57

+1

C,我已添加標籤。我不知道_P是宏。我們的老師要求我們學習berkeleyDB中的源文件,但我不擅長C. – Cruisehu 2013-04-20 16:51:14

+0

@也許你應該接受一個答案 – 2013-04-21 10:39:24

回答

11

__P()宏通常用於支持從K & R C的日子開始的C實現,當時沒有原型(C89引入C)。基本上邏輯是

#if SOME_LOGIC_TO_TEST_WHETHER_IMPLEMENTATION_SUPPORTS_PROTOTYPES 
# define __P(argument_list) argument_list 
#else 
# define __P(argument_list)() 
#endif 

你可以看到這是如何工作時適用於你的例子?請注意,此工作,不會導致語法錯誤,參數列表必須包括函數調用的括號的函數宏不只是括號。因此,使用宏時使用雙括號。這可能是它看起來很不尋常的原因。

+0

感謝您的回答。我們的老師要求我們學習berkeleyDB中的源文件。我只是停留在那一點上。我不擅長C.我想我應該學習更多關於C. – Cruisehu 2013-04-20 16:53:13

+0

@Maybe_hu這是一門很棒的語言,比C++更容易和更優雅(它不是**超集的C語言,但卻是一種完全不同的語言,恰好分享了一些語法和歷史)。 – Jens 2013-04-20 17:05:47

+0

因此,對於我來說,我應該閱讀哪些書籍或網站。可以爲我推薦一些嗎? – Cruisehu 2013-04-20 17:10:20

2

的函數指針的定義通常的形式是....但我看到了一個 形式,今天我不明白。

這裏沒什麼特別的,沒有神奇的語法。這是不是不同形式函數指針聲明。

這只是函數指針聲明的標準形式,__P()是由您正在使用的頭文件之一定義的宏。因此,找到宏定義來了解它的目的是什麼。

+0

或者它可以被有條件地定義爲返回它的參數或沒有任何東西。後一種情況是K&R C的遺留問題,它沒有原型。舊圖書館仍然包含這個黑客。 – Gene 2013-04-20 16:28:44

+0

@Gene我沒有試圖去理解'__P'。事實上,我已經消除了我的猜測。我試圖說的是,這不是可選的語法。這只是標準的語法和一個宏。 – 2013-04-20 16:31:18

9

__P()只是一個宏。在我的系統它被定義爲(在sys/cdefs.h)如下:

#if defined(__STDC__) || defined(__cplusplus) 
#define __P(protos)  protos   /* full-blown ANSI C */ 
#else /* !(__STDC__ || __cplusplus) */ 
#define __P(protos) ()    /* traditional C preprocessor */ 
#endif /* !__GNUC__ */ 

由此看來,似乎被用來維持(很)舊的編譯器兼容。

+0

哦!我知道了。感謝您的回答。 – Cruisehu 2013-04-20 16:53:52