GCC:Return 来自 C 中 void 函数的语句
GCC : Return statement from a void function in C
void bar()
表示 bar
returns 什么都没有。我很想知道,如果 void
returns 什么都没有,那么 为什么编译器 (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;
}
我已经使用 gcc -Wall myprog.c
进行了编译,并且运行良好。
此构造在 C99 中已被禁止:
return
without expression not permitted in function that returns a value (and vice versa)
使用正确版本的标准合规性打开 produces 一个适当的错误:
prog.c:11:16: error: ISO C forbids ‘return’ with expression, in function returning void [-Werror=pedantic]
return foo(); // Note this return statement.
^~~~~
至于为什么这适用于旧版本的 C,原来的 K&R 缺少 void
关键字,所以想要明确表示该函数不 return 任何东西的程序员正在使用#define VOID int
或类似的预处理器。当然,这个“穷人的 void
”允许 returning 一个 int
值,因此来自您的 post 的代码可以完美编译。我的猜测是该标准的早期版本的作者不愿意填补这个漏洞,因为这将是一个重大变化。
void bar()
表示 bar
returns 什么都没有。我很想知道,如果 void
returns 什么都没有,那么 为什么编译器 (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;
}
我已经使用 gcc -Wall myprog.c
进行了编译,并且运行良好。
此构造在 C99 中已被禁止:
return
without expression not permitted in function that returns a value (and vice versa)
使用正确版本的标准合规性打开 produces 一个适当的错误:
prog.c:11:16: error: ISO C forbids ‘return’ with expression, in function returning void [-Werror=pedantic]
return foo(); // Note this return statement. ^~~~~
至于为什么这适用于旧版本的 C,原来的 K&R 缺少 void
关键字,所以想要明确表示该函数不 return 任何东西的程序员正在使用#define VOID int
或类似的预处理器。当然,这个“穷人的 void
”允许 returning 一个 int
值,因此来自您的 post 的代码可以完美编译。我的猜测是该标准的早期版本的作者不愿意填补这个漏洞,因为这将是一个重大变化。