C 一个void返回函数g能否返回f();当f返回void时?
考虑以下代码段:C 一个void返回函数g能否返回f();当f返回void时?,c,language-lawyer,c11,C,Language Lawyer,C11,考虑以下代码段: void f(void); void g(…) { … return f(); … } 这是返回f()根据C11是否有效 我并不提倡使用这种模式:如果它真的有效,那么它显然相当于f();返回(其中返回;本身将是多余的,如果它位于函数g()的末尾)。我是在对C程序进行静态分析的背景下提出这个问题的,在这种情况下,C代码已经由其他人编写,问题是根据标准确定它是否有效 我将C116.8.6.4:1解释为非标准,应静态拒绝。是否有可能对其进行不同的解释(我在实际的和其他
void f(void);
void g(…)
{
…
return f();
…
}
这是返回f()代码>根据C11是否有效
我并不提倡使用这种模式:如果它真的有效,那么它显然相当于f();返回
(其中返回;
本身将是多余的,如果它位于函数g()
的末尾)。我是在对C程序进行静态分析的背景下提出这个问题的,在这种情况下,C代码已经由其他人编写,问题是根据标准确定它是否有效
我将C116.8.6.4:1解释为非标准,应静态拒绝。是否有可能对其进行不同的解释(我在实际的和其他高质量的源代码中发现了这种模式)
约束
带有表达式的返回语句不得出现在返回类型为void的函数中。没有表达式的返回语句只能出现在返回类型为void的函数中
它清楚地说明没有表达式的返回语句只能出现在返回类型为void的函数中
,请尝试执行以下操作:
void g()
{
return; // does not return any expression at all
}
void f()
{
return g();
}
int main(void) {
f();
return 0;
}
这显然违反了约束,特别是考虑到
6.3.2.2 void:void表达式(具有void类型的表达式)的(不存在)值不得以任何方式使用
这意味着不完整的类型void
是一个死胡同,不能用于任何目的。返回后的任何内容都是一个表达式
6.8.6:1跳转语句
它为我编写了一个警告;无关的返回值。对我来说,代码是有效的,不应该有任何警告。@al-Khwārizmī,即使您使用-Wall
编译?您使用的编译器是拒绝代码、安静地接受代码还是警告地接受代码?代码是否曾经是ISO C?RayToal GCC接受al Khwārizmī回答中的程序时,使用-std=c11-Wall
不带窥视,但-pedantic
会导致诊断。Clang还使用-Wpedantic
发出警告:无效函数“f”不应返回无效表达式[-Wpedantic]
GCC仅使用-pedantic
诊断是一个很好的指标,表明这是一个符合要求的扩展。我假设这是为了与C++兼容,其中[STMM.Re] /3表示“一个具有空类型表达式的返回语句只能在具有返回类型CV空隙的函数中使用;在函数返回给调用方之前,该表达式被评估。”“带有表达式的返回语句不应出现在返回类型为void的函数中”也出现在中,因此编译器在此警告而不是生成静态错误这一事实可能只是一个务实的选择。你是对的:我没有这样看,但6.8.6:1中的语法清楚地表明f()
应被视为一个表达式:根据语法,它不能是任何其他内容。@PascalCuoq;是。添加了该选项。
Syntax
...
return expressionopt;
[Warning] ISO C forbids 'return' with expression, in function returning void [-pedantic]