c# C11 _Generic是否可以不带参数使用?

km0tfn4u  于 2023-03-16  发布在  C#
关注(0)|答案(1)|浏览(125)

我想使用_Generic来重载函数,其中一个函数没有参数,类似于:

#include <stdio.h>
#include <string.h>

void f1(void)
{
    printf("F1\n");
}

void f2(int n)
{
    printf("F2 %d\n", n);
}

#define func(x) _Generic((x),   \
    int: f2,                    \
    default: f1                 \
    )(x)

int main(void)
{
    func(); // I want this to call f1
    return 0;
}

这可能吗?

ax6ht2ek

ax6ht2ek1#

C语言最酷的一点是它非常简单,所以你可以提出一些简单的解决方案,比如:

#include <stdio.h>
#include <string.h>

void f1(void *_)
{
    printf("F1\n");
}

void f2(int n)
{
    printf("F2 %d\n", n);
}

typedef struct { char _; } noarg_t;

#define NOARG &((noarg_t){0})

#define func(x) _Generic((x),       \
    int: f2,                        \
    noarg_t*: f1                    \
    )((void *)(x))

int main(void)
{
    func(NOARG); // This will call f1
    func(5);     // This will call f2 with argument of 5
    return 0;
}

它不是任何标准的一部分,看起来不像实际上不使用参数那样漂亮,但至少读起来是一样的。
希望这能帮上忙。

相关问题