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

时间:2013-04-20 16:18:01

标签: c function declaration function-prototypes

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

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

但我今天看到了一张我不明白的表格。有人可以解释一下吗?

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

3 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分: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__ */

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

答案 2 :(得分:2)

  

函数指针定义的常用形式是....但我看到了   形式今天,我不明白。

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

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