简单问题:
为什么我的代码会编译成这样:
#include <unistd.h>
#include <stdio.h>
void hello()
{
write (1, "3", 3);
}
int main ()
{
hello();
}
输出:3
当我在write (1, "3", 3);
之后的行中添加return(0);
时,为什么它不编译?
我得到的错误信息是:
2function.c:7:2: error: void function 'hello' should not return a value [-Wreturn-type]
return(0);
谢谢!
返回类型为void
的函数表示它不返回值。因此,如果这样的函数使用带有值的return
语句,则违反了函数的定义。
从返回类型不是void
的函数返回值也是不可取的,即使编译器允许。但是main
函数是个例外。如果main
没有返回任何值,则假定返回值为0。
void
没有任何意义。当函数返回类型为void时,不应该返回任何内容。或者您可以只写return;
。
这是因为您的函数
void hello()
被定义为类型";无效"-也就是说,你把它定义为不返回任何东西的东西。您可以添加
return;
直到最后,但这只是因为它没有返回值。如果您想在函数"中返回0;你好";您需要声明要返回的数据类型,而不是void,即
int hello()
这将允许您返回任何int,例如返回0;
您声明hello以返回"void";,也就是说什么都不说,但是您正在尝试返回0。
对于初学者,此调用
write (1, "3", 3);
调用未定义的行为,至少是因为字符串文字"3"
只包含2个字符(而不是您认为的3
),也就是说,它作为字符数组存储为{ '3', ' ' }
。
您将函数hello
声明为具有返回类型void
。此类函数不应返回值。
来自C标准(6.8.6.4返回语句)
1带有表达式的return语句不应出现在返回类型为void的函数不带表达式只能出现在返回类型为void的函数中。
因此编译器会针对插入的语句发出错误
return(0);
相反,你可以写
return;
尽管对于这样一个只包含一个语句的函数来说意义不大。
你似乎想插入声明
return(0);
在类似main
的中
int main( void )
{
hello();
return 0;
}
尽管在CCD_ 16中它可以被省略。
void表示当您将函数声明为void时,不返回任何内容。但如果你想返回一些东西,请将返回类型更改为int,float
等
要从函数返回任何内容,必须在函数名称之前指定返回类型。void没有任何意义,您正试图从hello()返回一个整数。这就是你犯错的原因。
#include <unistd.h>
#include <stdio.h
int hello(){
write (1, "3", 3);
return 0;
}
int main (){
hello();
return 0;
}