dereferencing function pointer to function returning void throws error: void value not ignored as it ought to be
dereferencing function pointer to function returning void throws error: void value not ignored as it ought to be
我是C语言初学者。阅读函数指针上的各种 SO 线程。例如,How does dereferencing of a function pointer happen, Function Pointer - Automatic Dereferencing [duplicate],所以我尝试做一个我的实验。
无法理解为什么会抛出此错误,因为我没有在任何地方使用 void 值..
#include <stdio.h>
void f(int j) {
static int i;
if (j == 1)
printf("f: i entered this function main()\n");
else if(j == 2)
printf("f: i entered this function through pointer to function\n");
void (*recurse)(int);
recurse = *f; // "f" is a reference; implicitly convert to ptr.
if (i == 0){
i++;
*recurse(2);
} else
return;
}
int main(void)
{
f(1);
return 0;
}
GCC 版本为 11.2.0
使用的编译器标志包括 -std=c99
如果我将第 14 行修改为 recurse(2)
然后程序运行顺利。编译器不会抛出任何错误或警告。
$ gcc testing11.c @compilerflags11.2.0.txt -o testing11.exe
testing11.c: In function ‘f’:
testing11.c:14:10: error: void value not ignored as it ought to be
14 | *recurse(2);
| ^~~~~~~~~~
这个表达式语句
*recurse(2);
等同于
*( recurse(2) );
因此,由于函数的 return 类型是 void
那么您正在尝试取消引用类型 void
.
你的意思好像是
( *recurse )(2);
或者你可以只写
recurse(2);
因为在第一次调用中使用的表达式*recurse
将再次隐式转换为函数指针。
所以虽然这个调用例如
( ******recurse )(2);
是正确的,但是取消引用指针表达式是多余的。
我是C语言初学者。阅读函数指针上的各种 SO 线程。例如,How does dereferencing of a function pointer happen, Function Pointer - Automatic Dereferencing [duplicate],所以我尝试做一个我的实验。
无法理解为什么会抛出此错误,因为我没有在任何地方使用 void 值..
#include <stdio.h>
void f(int j) {
static int i;
if (j == 1)
printf("f: i entered this function main()\n");
else if(j == 2)
printf("f: i entered this function through pointer to function\n");
void (*recurse)(int);
recurse = *f; // "f" is a reference; implicitly convert to ptr.
if (i == 0){
i++;
*recurse(2);
} else
return;
}
int main(void)
{
f(1);
return 0;
}
GCC 版本为 11.2.0
使用的编译器标志包括 -std=c99
如果我将第 14 行修改为 recurse(2)
然后程序运行顺利。编译器不会抛出任何错误或警告。
$ gcc testing11.c @compilerflags11.2.0.txt -o testing11.exe
testing11.c: In function ‘f’:
testing11.c:14:10: error: void value not ignored as it ought to be
14 | *recurse(2);
| ^~~~~~~~~~
这个表达式语句
*recurse(2);
等同于
*( recurse(2) );
因此,由于函数的 return 类型是 void
那么您正在尝试取消引用类型 void
.
你的意思好像是
( *recurse )(2);
或者你可以只写
recurse(2);
因为在第一次调用中使用的表达式*recurse
将再次隐式转换为函数指针。
所以虽然这个调用例如
( ******recurse )(2);
是正确的,但是取消引用指针表达式是多余的。