我有一些需要经常打印的结构。现在,我在这个结构周围使用经典的打印包装器:
void printf_mystruct(struct* my_struct)
{
if (my_struct==NULL) return;
printf("[value1:%d value2:%d]", struct->value1, struct->value2);
}
这个功能很方便,但也很有限。如果不制作新的包装器,我就无法预先添加或附加一些文本。我知道我可以使用 va_arg 系列来添加或追加一些文本,但我觉得我会重新实现轮子。
我想知道是否可以为 printf 编写自定义函数。我希望能够写出这样的东西:
register2printf("%mys", &printf_mystruct);
...
if (incorrect)
printf("[%l] Struct is incorrect : %mys\n", log_level, my_struct);
这可能吗?我该怎么做?
注意:我在 Ubuntu Linux 10.04 下使用 gcc。
最佳答案
抱歉,有些答案在使用 Glibc 的 Linux 上不正确
在带有 GNU Glibc 的 Linux 上,您可以 customize printf : 你会打电话
register_printf_function
例如定义 %Y
的含义在你的printf
格式化字符串。
但是,这种行为是 Glibc 特有的,甚至可能会过时......我不确定我会推荐这种方法!
如果用 C++ 编码,C++ 流库有可以扩展的操纵器,你也可以为你的类型重载 operator <<
等等
2018 年 2 月添加
你可以考虑写一个 GCC plugin对此有所帮助(并改进了一些扩展 printf
的类型检查)。这并不容易(可能需要数周或数月的工作),并且它将是特定于 GCC 版本的(GCC 7 和 GCC 8 的插件代码不同)。您可以添加一些特定的 #pragma
通知您的插件有关额外的控制字符串说明符,例如您的 %Y
以及他们期望的类型。你的插件应该改变处理 format
属性(可能在 gcc/tree.c
中)
关于c - 这可以自定义 printf 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9260170/