void bar()
意味着bar
什么都不返回.我很想知道,如果void
什么都不返回,为什么编译器(GCC)在编译下面的程序时没有给出任何警告或错误?
#include <stdio.h>
void foo (void)
{
printf("In foo() function\n");
}
void bar (void)
{
printf("In bar() function\n");
return foo(); // Note this return statement.
}
int main (void)
{
bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我编译使用gcc -Wall myprog.c
,它工作正常.
在C99中不允许使用此构造:
return
没有表达式,在函数中不允许返回值(反之亦然)
使用正确版本的标准合规性进行编译会产生相应的错误:
prog.c:11:16:错误:ISO C禁止'返回'表达式,函数返回void [-Werror = pedantic]
Run Code Online (Sandbox Code Playgroud)return foo(); // Note this return statement. ^~~~~
至于为什么这适用于旧版本的C,原始的K&R缺少void
关键字,所以程序员想要明确表示该函数不返回任何东西是使用预处理器#define VOID int
或类似的东西.当然,这个"穷人void
"允许返回一个int
值,所以你帖子中的代码可以完美编译.我的猜测是该标准的早期版本的作者不愿意插入这个漏洞,因为这将是一个突破性的变化.