C++ 返回C和C中的void类型++;
这在编译时没有任何警告 < P>这是C和C++中的合法还是在GCC和CLAN中工作? 如果它是合法的,它是C99之后的新事物吗C++ 返回C和C中的void类型++;,c++,c,gcc,clang,language-lawyer,C++,C,Gcc,Clang,Language Lawyer,这在编译时没有任何警告 < P>这是C和C++中的合法还是在GCC和CLAN中工作? 如果它是合法的,它是C99之后的新事物吗 void f(){ } void f2(){ return f(); } 更新 正如“雷克萨斯”所建议的,我尝试了以下方法: $ gcc -Wall -Wpedantic -c x.c x.c: In function ‘f2’: x.c:7:9: warning: ISO C forbids ‘return’ with expression, in f
void f(){
}
void f2(){
return f();
}
更新
正如“雷克萨斯”所建议的,我尝试了以下方法:
$ gcc -Wall -Wpedantic -c x.c
x.c: In function ‘f2’:
x.c:7:9: warning: ISO C forbids ‘return’ with expression, in function returning void [-Wpedantic]
return f();
更新 有人问这个建筑有什么帮助。Well或多或少是语法上的糖。这里有一个很好的例子:
void error_report(const char *s){
printf("Error %s\n", s);
exit(0);
}
void process(){
if (step1() == 0)
return error_report("Step 1");
switch(step2()){
case 0: return error_report("Step 2 - No Memory");
case 1: return error_report("Step 2 - Internal Error");
}
printf("Processing Done!\n");
}
此代码在
C++
中是允许的,但在C
从
在返回void的函数中,带有表达式的return语句可以
如果表达式类型为void,则使用
C11规范草案n1570中的OTOH: 第二版的主要变化包括: 在返回表达式的函数中不允许不带表达式的返回 价值(反之亦然) (
return
,在返回void
的函数中不允许使用表达式)
和6.8.6.4返回
带有表达式的返回语句不得出现在函数中 其返回类型为void。没有表达式的返回语句 只能出现在返回类型为void的函数中
(即使表达式的计算结果为
void
)ISO/IEC 9899:201x委员会草案规定如下:
6.8.6.4返回报表
约束条件
return
语句不得出现在返回类型为void
的函数中
没有表达式的return
语句只能出现在
返回类型为void
的函数您需要使用
-pedantic
切换到gcc
,以便it对标准违规行为进行投诉:
test.c: In function ‘f2’:
test.c:6:12: warning: ISO C forbids ‘return’ with expression, in function returning void
[-Wpedantic]
return f();
标准C不支持这种结构: C116.8.6.4:
返回
语句
约束条件
1带有表达式的return
语句不得出现在返回类型为void
的函数中。没有表达式的return
语句只能出现在返回类型为void
的函数中
对于问题中的特殊情况,没有增加特别规定。一些C编译器支持这一扩展(<代码> GCC >,除非被指示符合C标准之一),但是C11和以前的版本认为它是一个约束违反。 < P> <强> C11 < /强>,“3.84.4”“<代码>返回< /Cord>语句”: 带有表达式的
return
语句不得出现在返回类型为void
的函数中
否,即使表达式为void
类型,也不能使用该表达式
同一文件的前言:
第二版的主要变化包括:
[……]
在返回值的函数中不允许不带表达式(反之亦然)return
C++14,6.6.3“返回
语句”:
带有非void类型表达式的return语句只能在返回值[…]的函数中使用
表达式类型为void的return语句只能在返回类型为cv的函数中使用
无效的在函数返回其调用方之前对表达式求值
是,如果表达式为void类型(自C++98以来一直有效),则可以使用该表达式。C++允许这样的操作:
void f()
{
return void();
}
而C则不是。这就是为什么如果你编译一个ISO C而不是ISO C++的话发出警告。这正式描述为:
带有void类型表达式的return语句只能用于
返回类型为cv void的函数
投票决定重新开放;建议的副本仅用于C++。这也是C.(C++和C++在使用<代码> Value>代码>时有很大不同)。所以你是在问C还是C++?选择一种语言。注意:使用两个代码> GCC-WALDOW-ANDIATIC-STD= C99 < /Cord>和 -STD= C11 ,您得到警告:“警告:ISO禁止用表达式返回,函数返回空格[-Wpedantic ]。@ HOLYBLASCAT:我能同时询问C、C++和java吗?)戴夫索拉:好吧,我会说得更清楚。IMO是一个很好的问题,它既有C又有C++的特性。通常,这些特性在两种语言中的行为相似。如果不是,一个很好的答案将描述差异。它看起来正确,但标准的参考这两个索赔将是好的。最好是引用C++标准和可能的文件,因为哪个版本的建设是允许的。cppreference不是一个非常可靠的源代码,许多代码示例都有bug。@chqrlie你能给我一个链接,指向代码示例正在编写的页面@en.cppreference吗?@MohitJain:仅举一个例子:使用gcc 4.6:main.cpp:31:1:警告:控件到达非空函数的末尾[-Wreturn type]
。C99之后没有错误,但样式不好。@chqrlie谢谢。我没有C++规范,我需要最新的草稿和E.CPPype来参考我的参考。@ Mujjayn:C++最新草稿已经足够接近了。源代码实际上可以在github上获得!我希望C和C++标准是免费公开的。参考文献事实上有很好的记载,我之前的判断可能反映了我对法语翻译的印象。任何可见的bug都可以在发现时修复。“带有void类型表达式的return语句只能在返回类型为cv void的函数中使用”但是为什么有人想编写这样毫无意义的代码呢?而不仅仅是写void f2(){f();}
。看来一定有理由
void error_report(const char *s){
printf("Error %s\n", s);
exit(0);
}
void process(){
if (step1() == 0)
return error_report("Step 1");
switch(step2()){
case 0: return error_report("Step 2 - No Memory");
case 1: return error_report("Step 2 - Internal Error");
}
printf("Processing Done!\n");
}
test.c: In function ‘f2’:
test.c:6:12: warning: ISO C forbids ‘return’ with expression, in function returning void
[-Wpedantic]
return f();
void f()
{
return void();
}