是否可以自定义printf?

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

void printf_mystruct(struct* my_struct)

{

if (my_struct==NULL) return;

printf("[value1:%d value2:%d]", struct->value1, struct->value2);

}

此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用

系列添加或添加一些文本,但是我觉得我会重新实现。

我想知道是否有可能向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上,您可以自定义printf:您将调用 register_printf_function以例如%Yprintf格式字符串中定义的含义。

但是,此行为是Glibc特有的,甚至可能已经过时了……我不确定我是否会推荐这种方法!

如果使用C 进行编码,则C 流库具有可以扩展的操纵器,还可以为类型operator << 等重载。

于2018年2月新增

您可以考虑编写一个GCC插件来帮助实现这一点(并改进一些extended的类型检查printf)。这将不是一件容易的事(可能需要数周或数月的工作),并且将是特定于GCC版本的(与GCC

7和GCC

8的插件代码不同)。您可能需要添加一些特定的信息,#pragma以通知您的插件有关诸如您的控件字符串说明符%Y以及它们预期的类型的信息。您的插件应更改format属性的处理(也许在中gcc/tree.c

以上是 是否可以自定义printf? 的全部内容, 来源链接: utcz.com/qa/412243.html

回到顶部