是否有printf的一个通用的转换符? [英] Is there a generic conversion specifier for printf?

查看:70
本文介绍了是否有printf的一个通用的转换符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想打印变量的值,而不指定它的类型。

I wanna print variable value without specifying its type.

在C,我可以做

int main(int argc, char **argv) {
    int i = 1;
    float f = 0.1;
    char s[] = "s";

    printf("%i\n", i);
    printf("%f\n", f);
    printf("%s", s);
    return 0;
}

但我希望:

int main(int argc, char **argv) {
    int i = 1;
    float f = 0.1;
    char s[] = "s";

    printf("%any_type\n", i);
    printf("%any_type\n", f);
    printf("%any_type", s);
    return 0;
}

的问题:%any_type 用C

推荐答案

C11 你可以写一个通用的功能打印任何类型和不断增加你的自定义类型的功能。

In C11 you can write a generic function to print any type and keep adding your custom type to that function.

#define print_any(X) _Generic((X), int: print_int, \
                              default: print_unknown, \
                              float: print_float)(X)

int print_int(int i)
{
  return printf("%d\n", i);
}

float print_float(float f)
{
  return printf("%f\n", f);
}

float print_unknown(...)
{
  return printf("ERROR: Unknown type\n");
}

您也可以如下图所示自动化功能生成。

You can also automate the function generation as shown below.

#define GEN_PRINT(TYPE, SPECIFIER_STR) int print_##TYPE(TYPE x) { return printf(SPECIFIER_STR "\n", x);}
GEN_PRINT(int, "%d");
GEN_PRINT(char, "%c");
GEN_PRINT(float, "%f");

用法将是:

int main(int argc, char **argv) {
    int i = 1;
    float f = 0.1;
    char s[] = "s";

    print_any(i);
    print_any(f);
    print_any(s);
    return 0;
}

这篇关于是否有printf的一个通用的转换符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆