首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义返回不兼容类型但不可访问的函数

定义返回不兼容类型但不可访问的函数
EN

Stack Overflow用户
提问于 2015-11-18 14:28:15
回答 1查看 1.1K关注 0票数 2

在阅读了C99标准之后,我找不到禁止在下面定义函数f的任何部分:

代码语言:javascript
复制
struct s { double d; };

int f() {
  if (0) return (struct s){.d = 3.14};
  // There is intentionally no return statement of type int, which is valid
}

int main() {
  f();
  return 0;
}

特别是,应该定义该程序的行为,因为返回值(a)从一开始就没有达到,(b)从未使用过,即使它已经到达。

不过,我的大多数编译器(GCC、Clang和CompCert)都会阻止编译这个程序,同时也会出现错误returning 'struct s' from a function with incompatible result type 'int'。我确实成功地用tcc编译了它,但我不知道它是否主要是由于运气(即缺乏验证)。

请有人确认这个程序是否在语法上是有效的,并且它的行为是完全定义的,或者以其他方式指明标准禁止它的地方?

实际上,我希望我的编译器拒绝它,但例如,一些宏定义可以生成类似于此的代码,因此如果这些程序是有效的,那么接受这些程序可能是有用的。

背景

下面是我可以找到的C99标准的相关摘录,以及为什么它们不应该禁止我的程序在语法上有效和语义上定义良好的原因:

§6.8.6.4返回语句 §6.8.6.4.1带表达式的返回语句不应出现在返回类型为的函数中。没有表达式的返回语句只能出现在返回类型为whose的函数中。

在我的代码中,我们有一个非void函数,返回一个非void函数,所以一切看起来都很好。

如果执行带有表达式的语句,则表达式的值将作为函数调用表达式的值返回给调用方。如果表达式的类型与其出现的函数的返回类型不同,则将该值转换为具有函数返回类型的对象。

因为从来不执行return语句,所以上述内容不适用。

§6.9.1函数定义 §6.9.1.12如果达到终止函数的},并且调用方使用函数调用的值,则行为未定义。

调用方不使用函数调用的结果,因此应该定义行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-18 14:34:20

“如果表达式的类型与其出现的函数的返回类型不同,则将该值转换为具有该函数的返回类型的对象。”是一个独立的句子。它不以“如果执行带表达式的返回语句”为条件,因此甚至适用于您的代码。我确信您已经知道了转换,就好像通过赋值意味着不兼容的类型允许编译时错误。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33782633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档