printf()由gcc检查的包装器参数

min*_*hua 6 c printf gcc warnings wrapper

当C printf()及其系列由命令行编译gcc并-Wall在命令行上使用时,编译器会根据正在使用的格式字符串警告错误的参数.作为一个例子,下面的代码会得到一条错误消息,说明格式指定了3个参数,但实际上你只传递了两个.

printf("%d%d%d", 1, 2);
Run Code Online (Sandbox Code Playgroud)

在编写包装器时printf(),如何保留此功能?一种功能或宏的形式将是我能想到的.但是简单的解析器也是可以接受的.

可以在stackoverflow上找到编写printf包装器的几种方法.两种常见的方法是使用vprintf和varargs,并使用__builtin_apply.我试过这两种方法,都没有用.

Pic*_*dev 5

您可以使用gcc 格式函数属性,以便根据格式字符串检查参数。

extern int my_printf (void *my_object, const char *my_format, ...)
           __attribute__ ((format (printf, 2, 3)));
Run Code Online (Sandbox Code Playgroud)

查看gcc手册“ 6.31.1常用功能属性”

  • 如果my_printf是类成员,请注意:在参数编号上加1。它会变成`__attribute__((format(printf,3,4)));`` (2认同)