通常函数指针的定义形式如下:
今天我看到一个表格,但是我不理解它。有人可以解释一下吗?
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 中引入的)。基本逻辑是
#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__ */
从这个描述中可以看出,它似乎用于与(非常)老的编译器保持兼容性。
int functionname __P((int))
,我们将会得到完整的ANSI int functionname (int)
和传统的C预处理器 int functionname ()
。这是有效的,因为“早期的K&R C”确实有函数声明,如果仅指定返回类型而不是参数类型,则使用了括号()
来替换参数。 - humanityANDpeace__P
的作用。事实上,我已经删除了我的猜测。我想表达的观点是这不是另一种语法,而只是标准语法和宏。 - David Heffernan
__P
宏是什么吗? - Rup