【发布时间】: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 像 malloc、free、read 等),或者我们已经完成的那个我们自己。
编辑:作为参考,格式%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