使用 ## 预处理器运算符的示例

Example of using the ## preprocessor operator

我知道以下是一个非常简单的示例,但我如何将以下内容转换为使用预处理器 ## 'glue' 运算符的单个函数调用?

void print_string(char *s)
{
    printf("%s\n", s);
}
void print_num(int n)
{
    printf("%d\n", n);
}

int main(void)
{
    print_string("Hello");
    print_num(5);
}

我唯一能做的(这并没有真正简化任何事情)是:

#define PRINT(type) print_ ## type
PRINT(string)("Hello");
PRINT(num)(4);

或者,有更好的使用方法吗?

您可以将标识作为第一个函数参数:

#define PRINT(type, value)   print_ ## type(value)
PRINT(string, "Hello");
PRINT(num, 4);

但我认为写 printf 没有任何价值,因为在 int 的情况下,有人将不得不学习写 num,他还不如学习使用%d 无论如何:

printf("%s\n", "Hello");
printf("%d\n", 4);

pre 处理器中无法进行类型分派 - 它不知道类型。在 C11 中有 _Generic 允许编译器根据类型选择不同的函数:

#define PRINT(value) _Generic((value), \
        char *: print_string, \
        int: print_int)(value)
PRINT("Hello");
PRINT(4);

通过在每个参数上重载宏并在每个参数上应用这样的 _Generic 宏,可以构建 C++ std::cout 的替代品。所以有点自我推销:这是我在 yio library 中探索的一个主题,它允许只做:

yprint("Hello ", 4, "\n");