从void函数返回void函数

时间:2014-08-15 18:32:40

标签: c

我可以做以下事情:

static int16_t foo (void);

static int16_t bar (void) {
    return foo();
}

但我的编译器抱怨

static void foo (void);

static void bar (void) {
    return foo();
}

ANSI C不允许void函数返回void函数吗?为什么呢?

3 个答案:

答案 0 :(得分:7)

如果您希望bar返回foo,则必须更改bar的返回类型,以便它返回function that takes void and returns void而不只是void }:

static (void (*)(void)) bar(void) {
    return foo;
}

此外,第一个例子也不应该起作用。

根据您的修改进行修改:您无法return void来自void功能的任何数据。 return;缺少数据。在C中,您只能void来自声明为返回return <data>;的函数 - 您无法foo()

所以return foo();没有给你任何数据。它只能用作语句,而不能用作表达式。

因此,

bar在两个方面没有意义:第一个是void可能不会返回任何内容,因为它被声明返回bar,第二个是即使foo() {1}} 会返回实际数据类型,void仍然是return类型,而您不能foo

第一个示例有效,因为barint16_t都返回{{1}} s,这是实际数据。

答案 1 :(得分:5)

尝试从声明的函数返回值而不返回值是错误的。

不要这样做。

另外,我真的希望你的编译器抱怨隐式将函数指针转换为整数,尽管它只是一个警告而不是错误。
不过,请留意它!


现在在编辑之后(调用函数而不是返回它),return expression;中仍然禁止void - 函数(C ++允许它,但是用于泛型编程)。

尝试使用完整警告:http://coliru.stacked-crooked.com/a/63cc53e798062820

标准报价(C11):

  

6.8.6.4 return语句

     

约束
  1带有表达式的return语句不应出现在返回类型的函数中   是void。不带表达式的return语句只能出现在函数中   其返回类型为void

答案 2 :(得分:0)

您的bar函数不会返回void,而是返回void返回函数。您的方法必须返回void的函数指针。

typedef void (*fptr)();

static fptr bar (void) {
    return foo;
}