function指针声明 – __P做什么?

通常的函数指针定义forms是:

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()只是一个宏。 在我的系统上,它定义如下(在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__ */ 

由此,它似乎用于保持与(非常)旧编译器的兼容性。

通常的函数指针定义forms是….但我今天看到了一个我不理解的表单。

这里没有什么特别的,没有神奇的语法。 这不是函数指针声明的不同forms

这只是函数指针声明的标准forms,而__P()是由您正在使用的一个头文件定义的宏。 因此,找到宏定义来了解其目的是什么。