我尝试用返回类型编写一个void函数,并且由于某种原因可以正常工作。 这是我试图编译的一些代码:
void a(){
return b();
}
void b()
{
printf("%s","void:)");
}
下一个代码也能正常工作:
int main()
{
a();
return 0;
}
void a(){
return 5;
}
根据标准,上述哪一项是正确的?
其次,为什么要编译?
答案 0 :(得分:3)
根据标准,上述哪一项是正确的?
根据C和C ++标准,两者都不正确。 C标准说:
带有表达式的
return
语句不应出现在返回类型的函数中 是void
。没有表达式的return
语句只能出现在函数中 其返回类型为void
。
另请阅读此answer以获取更详细的说明。
其次,为什么要编译?
编译不保证您的代码不会产生错误。它可以。最好使用最大警告标志编译代码。我使用以下选项编译了第二个代码并得到以下警告:
In function 'main':
[Warning] implicit declaration of function 'a' [-Wimplicit-function-declaration]
At top level:
[Warning] conflicting types for 'a' [enabled by default]
[Note] previous implicit declaration of 'a' was here
In function 'a':
[Warning] 'return' with a value, in function returning void [enabled by default]
虽然编译了代码,但存在一些错误并违反了C标准。
答案 1 :(得分:1)
两个程序无效。在b()
中调用它之前,您未能在第一个程序中提供a()
的函数定义或声明,并且在a()
中调用它之前未能提供main()
的函数定义在第二个程序中。
您的编译器正在提供"默认"未申报职能的原型:
int func();
这是一个以任何参数并返回int
的函数。这可能不是你想要的。您的编译器应该发出警告,说它正在提供默认函数声明。
如果正确地向前声明函数(void b();
和void a();
),编译器将正确拒绝这两个程序。