的函數指針的定義通常的形式是:函數指針聲明 - __P做什麼?
int function(int, int);
int (*ptr)(int, int);
,但我看到了一個形式,今天我不明白。任何人都可以解釋這個嗎?
int (*close) __P((struct __db *));
的函數指針的定義通常的形式是:函數指針聲明 - __P做什麼?
int function(int, int);
int (*ptr)(int, int);
,但我看到了一個形式,今天我不明白。任何人都可以解釋這個嗎?
int (*close) __P((struct __db *));
__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
你可以看到這是如何工作時適用於你的例子?請注意,此工作,不會導致語法錯誤,參數列表必須包括函數調用的括號的函數宏不只是括號。因此,使用宏時使用雙括號。這可能是它看起來很不尋常的原因。
的函數指針的定義通常的形式是....但我看到了一個 形式,今天我不明白。
這裏沒什麼特別的,沒有神奇的語法。這是不是不同形式函數指針聲明。
這只是函數指針聲明的標準形式,__P()
是由您正在使用的頭文件之一定義的宏。因此,找到宏定義來了解它的目的是什麼。
或者它可以被有條件地定義爲返回它的參數或沒有任何東西。後一種情況是K&R C的遺留問題,它沒有原型。舊圖書館仍然包含這個黑客。 – Gene 2013-04-20 16:28:44
@Gene我沒有試圖去理解'__P'。事實上,我已經消除了我的猜測。我試圖說的是,這不是可選的語法。這只是標準的語法和一個宏。 – 2013-04-20 16:31:18
__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__ */
由此看來,似乎被用來維持(很)舊的編譯器兼容。
哦!我知道了。感謝您的回答。 – Cruisehu 2013-04-20 16:53:52
這是C還是C++? (請以任何方式將標籤添加到問題中)。你知道'__P'宏是什麼嗎? – Rup 2013-04-20 16:19:57
C,我已添加標籤。我不知道_P是宏。我們的老師要求我們學習berkeleyDB中的源文件,但我不擅長C. – Cruisehu 2013-04-20 16:51:14
@也許你應該接受一個答案 – 2013-04-21 10:39:24