函数指针定义的通常形式是:
int function(int, int);
int (*ptr)(int, int);
但是我今天看到了一个我不明白的表格。任何人都可以解释一下吗?
int (*close) __P((struct __db *));
函数指针定义的通常形式是:
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()
只是一个宏。在我的系统上,它的定义如下(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__ */
由此看来,它似乎被用来保持与(非常)旧编译器的兼容性。
函数指针定义的通常形式是....但是我今天看到了一个我不明白的形式。
这里没有什么特别的,没有神奇的语法。这不是函数指针声明的不同形式。
这只是函数指针声明的标准形式,__P()
是由您正在使用的头文件之一定义的宏。因此,找到该宏定义以了解其用途。