【问题标题】:Allowing %n$ operand for custom printf允许自定义 printf 的 %n$ 操作数
【发布时间】:2018-06-25 09:35:36
【问题描述】:

我有一个 printf 的自定义实现,我在学校项目中使用它。 希望得到与 printf 相同的警告,我使用 __attribute__((format (printf ...))。这很好用,但是使用-Wall -Wextra -Werror -std=c11 -pedantic-errors,我在gcc 7.2.0 上收到错误ISO C does not support %n$ operand number formats。 (我的实现支持该格式)。 如果我使用std=c11,它不会发出警告,但会使用std=c99

该格式是 c11 规范的一部分(就像我认为的 clang 行为)还是只是 Singe Unix 规范(这是我的手册页所说的)?如果是这样,我该如何使用它?在this page 中,我找不到它作为std 的选项。

我宁愿不禁用任何警告,因为它们非常有用并且可以捕获很多信息。但是有没有办法在格式字符串中允许这种格式,或者只为我的函数指定?

非常感谢。

PS:我使用 printf 的自定义实现,因为在我的学校项目中,我们只能使用特定的允许功能(基本上,系统 api 像 mallocfreeread 等),或者我们已经完成的那个我们自己。

编辑:作为参考,格式%n$n 是非零数字的数字字符串,允许访问给定变量参数列表中该索引处的参数(从一开始)打印。 (并且可以用于转换本身或带有* 操作数的精度或字段宽度)。

【问题讨论】:

  • 这种格式确实是 POSIX 扩展,而不是在 C 规范中(在 C99 和 C11 中都没有)。
  • “那是c11规范的格式部分吗” --> 没有。
  • 替代方案:创建一个名为 VT_printf() 的新函数,该函数又调用 vprintf() 在使用 "%n$" 时调用 VT_printf()。 IOW,不要使用无效参数直接调用标准 C 库函数。
  • @Someprogrammerdude 有没有办法告诉编译器我可以使用那个 POSIX 扩展? @chux我不明白这将如何解决我的问题?您的意思是不使用属性对VT_printf 执行检查?但是我的格式字符串中的拼写错误将不再被捕获。
  • 是的,迂腐的错误总是会抱怨它:/

标签: c compiler-warnings c11 standards-compliance sus


【解决方案1】:

您可以在属性中使用gnu_printf 而不是printf 来模拟更接近POSIX'printf 的行为。

【讨论】:

  • gnu_printf() 的参考资料在哪里?我的搜索不成功。
  • 。 IE。该属性有效,但警告不会被抑制。
猜你喜欢
  • 2021-06-05
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多