可以自定义printf吗?

2024-01-19

我有一些需要经常打印的结构。现在,我在这个结构周围使用经典的打印包装器:

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。


Sorry, but some answers are incorrect on Linux with Glibc

在带有 GNU Glibc 的 Linux 上,您可以自定义 printf http://www.gnu.org/software/libc/manual/html_node/Customizing-Printf.html: 你会打电话register_printf_function例如定义的含义%Y在你的printf格式化字符串。

然而,这种行为是 Glibc 特有的,甚至可能变得过时......我不确定我是否会推荐这种方法!

如果使用 C++ 进行编码,C++ 流库具有您可以扩展的操纵器,并且您还可以为您的类型重载operator << etc.

2018 年 2 月添加

你可以考虑写一个海湾合作委员会插件 https://gcc.gnu.org/onlinedocs/gccint/Plugins.html帮助这一点(并改进一些扩展的类型检查printf)。这并不容易(可能需要几周或几个月的工作),而且它将是特定于 GCC 版本的(GCC 7 和 GCC 8 的插件代码不一样)。你可以添加一些具体的#pragma通知您的插件有关额外的控制字符串说明符,例如您的%Y以及他们所期望的类型。你的插件应该改变处理format属性(也许在gcc/tree.c)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可以自定义printf吗? 的相关文章

随机推荐