功能指针声明 - __P做什么?

Cru*_*ehu 8 c declaration function function-prototypes

通常的函数指针定义形式是:

 int function(int, int);
 int (*ptr)(int, int);
Run Code Online (Sandbox Code Playgroud)

但我今天看到一张我不明白的表格.有人能解释一下吗?

int (*close)    __P((struct __db *));
Run Code Online (Sandbox Code Playgroud)

Jen*_*ens 12

__P()从K&R C开始,当没有原型(用C89引入C)时,宏通常用于支持C实现.基本上逻辑是

#if SOME_LOGIC_TO_TEST_WHETHER_IMPLEMENTATION_SUPPORTS_PROTOTYPES
#  define __P(argument_list) argument_list
#else
#  define __P(argument_list) () 
#endif
Run Code Online (Sandbox Code Playgroud)

在应用于您的示例时,您能看到它的工作原理吗?请注意,为了使其工作并且不会导致语法错误,参数列表必须包含函数调用的括号,而不仅仅是函数式宏的括号.因此,当使用宏时,双括号.这可能是它看起来不寻常的原因.


NPE*_*NPE 9

__P()只是一个宏.在我的系统上,它定义如下(in 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__ */
Run Code Online (Sandbox Code Playgroud)

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