【问题标题】:Function Pointer Declaration - what does __P do?函数指针声明 - __P 做什么?
【发布时间】:2013-04-13 21:38:27
【问题描述】:

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

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

但是我今天看到了一个我不明白的表格。谁能解释一下?

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

【问题讨论】:

  • 这是 C 还是 C++? (请以任何一种方式将标签添加到问题中)。你知道__P 宏是什么吗?
  • C,我添加了标签。我不知道 _P 是宏。我们的老师让我们学习berkeleyDB中的源文件,但是我不擅长C。
  • @也许你应该接受一个答案

标签: c function declaration function-prototypes


【解决方案1】:

__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

当你应用到你的例子时,你能看到它是如何工作的吗?请注意,要使其正常工作且不会导致语法错误,参数列表必须包含 函数调用 的括号,而不仅仅是 类函数宏。因此,使用宏时要加上双括号。这可能就是它看起来不寻常的原因。

【讨论】:

  • 感谢您的回答。我们的老师要求我们学习berkeleyDB中的源文件。我只是卡在那个点上。我不擅长 C。我想我应该更多地了解 C。
  • @Maybe_hu 这是一门很棒的语言,而且比 C++ 更简单、更优雅(不是 C 的超集,而是一种完全不同的语言,恰好共享一些语法和历史)。
  • 那么对我来说,我应该读什么书或网站。你能为我推荐一些吗?
  • 只有一本书是必不可少的:Kernighan,Ritchie,C 编程语言,第二版。这些是语言作者。其他都是意见:-)
  • @Jens 除了今天的语言完全不同。这并不意味着语言作者是最好的解释者。我实际上认为这是一本好书,但这是因为它本身的优点,而不是作者是谁。
【解决方案2】:

__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 预处理器 i> int functionname () 这是有效的,因为“早期 K&R C”确实有函数声明,如果使用只指定返回类型而不是参数类型,因此在这种情况下将参数替换为 ()。跨度>
【解决方案3】:

函数指针定义的通常形式是....但是我看到了一个 今天的表格,我没看懂。

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

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

【讨论】:

  • 或者它可以有条件地定义为返回其参数或不返回任何内容。后一种情况是没有原型的 K&R C 遗留下来的。旧库仍然包含此 hack。
  • @Gene 我并不想深入了解__P 所做的事情。事实上,我已经消除了我的猜测。我试图说明的一点是,这不是替代语法。它只是标准语法和宏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2020-04-13
  • 1970-01-01
  • 2018-11-11
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多