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()因此,code>在两个方面没有意义:第一个是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扩展。这是对这个问题的旧版本的回答。请参阅编辑的版本。