当前位置: 首页 > 面试题库 >

是否可以自定义printf?

颜森
2023-03-14
问题内容

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

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上,您可以自定义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



 类似资料:
  • 我能够在eclipse中远程调试apache nifi自定义处理器(参考:1、2、3)。我遵循的步骤如下: > 取消apache nifi bootstrap.conf中行下的注释 启动apache nifi

  • 问题内容: 是否可以向HTML标记添加自定义属性,如下所示? 问题答案: 您可以修改!DOCTYPE声明(即DTD)以允许它,以便[XML]文档仍然有效: 表示它是可选属性,或者您可以使用,等等。

  • 问题内容: 在数学课上,我们学习了如何定义新的运算符。例如: 这定义了法律。对于x和y的任何实数,x y是x + 2y。 范例:。 可以在JavaScript中定义这样的运算符吗?我知道函数可以胜任: 但我想使用以下语法: 代替这个: 哪个是最接近这个问题的解决方案? 问题答案: 最简洁的答案是不。ECMAScript(标准JS所基于的)不支持运算符重载。 可以使用sweet.js之类的第三方工具

  • 我试图做一些关于FCM的firebase通知的定制。有可能做到吗?

  • Google API是否可以同时用于自定义域Google帐户和gmail帐户 我对此做了一些研究,发现有两种类型的Google API,一种是简单的Google API,另一种是Google Domain API 我想使用谷歌api,这样我就可以验证工作人员的电子邮件,无论他们是Gmail用户还是谷歌商业账户持有人 我对这两个API感到困惑,我想知道Google API是只支持gmail帐户,还是

  • 问题内容: 我有协议(如http),其方案由在Mac OS XIe中注册的第3方应用程序,x-someapp:// someaction或类似的东西管理。 如何使用Google Chrome浏览器打开此URL?默认情况下,Chrome开始在Google引擎中搜索,而不是启动App并将URL处理传递给它。 Safari启动一些已注册的应用程序。这是对的。 Firefox和Opera问该怎么办…,我也