【问题标题】:Compatible types and argument type qualifiers兼容类型和参数类型限定符
【发布时间】:2013-08-15 11:00:06
【问题描述】:

这两种声明的类型是否兼容?

void f(char *, char *);
void f(char *restrict, char *restrict);

或类似:

void g(char *);
void g(char *const);

我很难在标准中找到涵盖该问题的任何内容。我最感兴趣的主题是手动原型化函数是否有效,省略restrict关键字,其中实际类型可能具有限制限定参数,具体取决于C版本或正在使用的其他库的版本。

【问题讨论】:

  • 是的,这些是兼容的; 挖掘标准报价

标签: c language-lawyer restrict-qualifier


【解决方案1】:

原型中参数的名称无关紧要,因此这些定义是等价的。但是,输入名称是一个很好的做法,因为这些名称应该可以让您了解这些参数的用途。但从技术上讲,它们不是必需的,但可以用作文档。

constqualifier 是另一回事,因为它改变了函数的含义。

【讨论】:

  • 我的参数列表中没有参数名称,只有类型限定符。
  • 并且不清楚const改变了函数的“签名”。 const 不适用于指向的类型。它适用于接收函数内部参数值的自动存储对象,这是函数的实现细节,而不是其接口契约的一部分。
  • @R..,你说得对,signature这个词用错了,我把它改成了mean,好像也错了,但是我不知道怎么更好的用英文表达。跨度>
【解决方案2】:

它们是兼容的:

(C99, 6.7.5.3 函数声明符(包括原型) p15) "[...] (在确定类型 兼容性和复合类型,每个参数用函数或数组声明 type 被视为具有调整后的类型,并且每个参数都声明为限定类型 被认为具有其声明类型的非限定版本。)"

【讨论】:

  • 对我错误地确定谁先发帖表示歉意。 ;-) 不过,至少@Christoph 确实先发表了评论。
  • @R.. 没问题,我们真的很亲密。
【解决方案3】:

C11 部分 6.7.6.3 §15:

在确定类型兼容性和复合类型时,将每个声明为函数或数组类型的参数视为具有调整后的类型,将每个声明为限定类型的参数视为具有其声明的非限定版本输入

【讨论】:

  • 我很难确定要接受哪个答案,但我看到你的答案中的“38 分钟前”更改为“39 分钟前”,就在 ouah 的答案之前,所以这个是你的. :-)
  • @R.. 您可以将鼠标悬停在答案的时间戳上,查看答案发布的确切时间。实际上 ouah 比 Christoph 早 18 秒发布了他的答案。选择当然是你的 ;-)
  • @KingsIndian:在我的辩护中,我的评论早于他和我的回答
  • @Christoph 我不知道你在防御什么。这绝不是要冒犯你 :) R.. 似乎暗示你在 ouah 之前发帖,这就是我评论的原因。我还知道您发布了您的评论之前你们俩都发布了相同的答案。如果它让一天变得更好,也给你 +1 ;-)
  • @KingsIndian:这是在开玩笑,但请随意投票,以免伤害我的感情:p
猜你喜欢
  • 1970-01-01
  • 2018-09-07
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多