C 从void函数返回void函数

C 从void函数返回void函数,c,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函数吗?为什么?如果希望bar返回foo,则必须更改bar的返回类型,以便它返回一个函数,该函数取void并返回void

我可以做到以下几点:

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函数吗?为什么?

如果希望
bar
返回
foo
,则必须更改
bar
的返回类型,以便它返回一个
函数,该函数取void并返回void
,而不仅仅是
void

static (void (*)(void)) bar(void) {
    return foo;
}
而且,第一个例子也不应该起作用

根据您的编辑进行编辑:您不能(不应该)
作废
函数返回任何数据
void
表示缺少数据。在C语言中,只能
返回来自声明为返回的函数
void
——您不能
返回从它

因此
foo()
不会提供任何数据。它只能用作语句,不能用作表达式

返回foo()在两个方面没有意义:第一个是
bar
可能不会返回任何声明为返回
void
的内容,第二个是,即使
bar
确实返回了实际的数据类型,
foo()
仍然是
void
类型,并且您不能
返回该类型


第一个示例之所以有效,是因为
foo
bar
都返回
int16\u t
s,这是实际数据。

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

不要那样做

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


现在在编辑之后(调用函数而不是返回函数),
返回表达式void
-函数中仍然禁止使用code>(不过,对于泛型编程,C++允许这样做)

尝试在完全警告的情况下执行此操作:

标准报价(C11):

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


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

typedef void (*fptr)();

static fptr bar (void) {
    return foo;
}

第一个例子也不应该起作用。你确定吗?在返回时的函数调用中,忘记添加括号,编辑后添加括号我是个笨蛋-使用
编译-pedantic
会导致警告。看起来它是一个GCC扩展。这是对这个问题的旧版本的回答。请参阅编辑的版本。