我可以做以下事情:
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函数吗?为什么呢?
答案 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
。
第一个示例有效,因为bar
和int16_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;
}