gpt4 book ai didi

c - 定义返回不兼容类型但无法访问的函数

转载 作者:行者123 更新时间:2023-12-02 22:08:17 25 4
gpt4 key购买 nike

通读 C99 标准后,我找不到任何禁止定义函数 f 的部分:

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)都会阻止编译该程序,并出现错误从具有不兼容结果类型“int”的函数返回“struct s”。我确实设法用 tcc 编译了它,但我不知道这是否主要是由于运气(即缺乏验证)。

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

我实际上更喜欢我的编译器拒绝它,但例如某些宏定义可能会生成与此类似的代码,因此如果它们有效,接受此类程序实际上可能很有用。

背景

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

§6.8.6.4 The return statement

§6.8.6.4.1 A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.

在我的代码中,我们有一个非 void 函数,它具有非 void 返回值,因此一切看起来都很好。

§6.8.6.4.3 If a return statement with an expression is executed, the value of the expression is returned to the caller as the value of the function call expression. If the expression has a type different from the return type of the function in which it appears, the value is converted as if by assignment to an object having the return type of the function.

由于 return 语句从未执行,因此上述内容不适用。

§6.9.1 Function definitions

§6.9.1.12 If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.

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

最佳答案

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

关于c - 定义返回不兼容类型但无法访问的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com