我有一个我在学校项目中使用的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
。 (我的实现支持那种格式)。
在clang上,如果我使用std=c11
,则不会发出警告,但会使用std=c99
。
这种格式是c11规范的一部分(我认为是clang行为)还是只有Singe Unix规范(这是我的手册页中所说的)?如果是这样,我该如何使用它?在this page中,我无法将其作为std
的选项。
我宁愿不禁用任何警告,因为它们非常有用并且捕获了很多。但有没有办法在格式字符串中允许该格式,或仅为我的函数指定?
非常感谢。
PS:我使用printf的自定义实现,因为在我的学校项目中,我们只能使用特定的允许函数(基本上,系统api,如malloc
,free
,read
等,或者我们自己做的那个。
编辑:作为参考,格式为%n$
,n
为非零数字的数字字符串,允许访问该列表中的索引(从1开始)的参数。给printf的变量参数。 (并且可以用于转换本身或用于*
操作数的精度或字段。
答案 0 :(得分:0)
您可以在属性中使用gnu_printf
代替printf
来建模更接近POSIX'的行为。 printf
。