简体   繁体   中英

dereferencing function pointer to function returning void throws error: void value not ignored as it ought to be

I am a beginner in C language. Read various SO threads on function pointers. For instance, How does dereferencing of a function pointer happen , Function Pointer - Automatic Dereferencing [duplicate] , so I tried to do an experiment of mine.

Couldn't understand why this error is thrown since I am not using the void value anywhere..

#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 Version is 11.2.0 Compiler flags used include -std=c99 if I modify line 14 to recurse(2) then the program runs smoothly. No error or warning is thrown by the compiler.

$ 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);
         |          ^~~~~~~~~~

This expression statement

*recurse(2); 

is equivalent to

*( recurse(2) ); 

So as the return type of the function is void then you are trying to dereference the type void .

It seems you mean

( *recurse )(2); 

Or you could just write

recurse(2); 

because the expression *recurse used in the first call will be again implicitly converted to a function pointer.

So though this call for example

( ******recurse )(2); 

is correct nevertheless dereferencing the pointer expressions are redundant.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM