用void重载函数

ASa*_*kar 1 c

试图用C语言重载C编程语言中的函数_Generic。找到了示例:

这个例子:

#include <stdio.h>
#include <math.h>

void display_float(float dispid) ;
void display_int(int dispid) ;
void display_void(void) ;

#define display(x) _Generic((x), \
          float: display_float, \
          int: display_int,  \
          default: display_float  \
)(x)

void display_void(void){
    printf("display id: 0\n") ;
}

void display_float(float dispid){
   printf("display id: %f\n", dispid) ;
}

void display_int(int dispid){
    printf("display id: %d\n", dispid) ;
}

void main(void){

    display(5) ;
    display(6.5) ;
}
Run Code Online (Sandbox Code Playgroud)

现在,我也想使用来重载该函数display()。意味着该函数将接收a void,调用该函数display_void()并显示0。似乎无法做到这一点。任何帮助,将不胜感激。

编辑1:

另外,请参阅此处的示例。我认为,其中一个示例是传递指向void的指针。可以实施吗?

Kam*_*Cuk 5

当然。重载参数宏

void display_float(float dispid) ;
void display_int(int dispid) ;
void display_void(void) ;

#define _display_1(x) _Generic((x), \
          float: display_float, \
          int: display_int,  \
          default: display_float  \
)(x)
#define _display_0()  display_void()
#define _display_N(_0,_1,N,...)  _display_ ## N
#define display(...) _display_N(_0,##__VA_ARGS__,1,0)(__VA_ARGS__)

int main() {
    display();
    display(1);
    display(1.1);
}
Run Code Online (Sandbox Code Playgroud)

测试在godbolt

请注意,这, ##__VA_ARGS__是C标准中未描述的gcc扩展