c - 这可以自定义 printf 吗?

标签 c linux customization glibc

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

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/

相关文章:

c - 如何静态链接动态链接另一个库的库?

c - MOV指令如何使用物理地址?

iphone - 无法从 AppDelegate 自定义我的选项卡栏

php - 如何在 Joomla 中添加自定义 PHP?

python - 如何在自定义颜色图中获取屏蔽值的透明度 (matplotlib/python)

c - thread_create_running 导致我的整个计算机在 OSX 10.6 上重新启动

c - 在阻塞 recv 调用的情况下,如果对等方系统重新启动,则调用不会来自 out recv。为什么?

c++ - 一些 C/C++ 语法

linux - 如何获取 "getgroups"用户的所有组

php从U盘修改文件名