MrS*_*iba 3 c printf c99 variadic variadic-functions
我尝试使用简单的日志记录机制在创建日志时创建错误检查。我观察到,与 printf 相比,可以使用vfprintf(),它在编译时不会打印任何警告,传递给 format 的参数太多(参见下面的示例)。(我不希望他们有相同的行为,但我仍然期望类似的行为)。关于这个问题,即使在编译时已知可变参数的数量。在编译时是否可以通过任何方式进行检查?\n下面,我准备了一个代码示例,在编译时编译器将打印有关 printf 的警告,并且工作vfprintf()正常,没有任何错误。也许第二个可变参数被忽略了?我读过这个人,但找不到任何有用的信息。
#include <stdarg.h>\n#include <stdio.h>\n\nvoid check_printf_usage(char *fmt, ...)\n{\n va_list ap;\n \n va_start(ap, fmt);\n vfprintf(stdout, fmt, ap);\n va_end(ap);\n}\n\nint main()\n{\n int x = 1;\n int y = 2;\n printf("test nr.1 %i\\n", x, y); // works as expected, prints warning\n check_printf_usage("test nr.2 %i\\n", x, y); // does not print any warning\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n这是编译输出+程序输出:
\n#include <stdarg.h>\n#include <stdio.h>\n\nvoid check_printf_usage(char *fmt, ...)\n{\n va_list ap;\n \n va_start(ap, fmt);\n vfprintf(stdout, fmt, ap);\n va_end(ap);\n}\n\nint main()\n{\n int x = 1;\n int y = 2;\n printf("test nr.1 %i\\n", x, y); // works as expected, prints warning\n check_printf_usage("test nr.2 %i\\n", x, y); // does not print any warning\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n
参数检查printf和朋友是编译器(gcc 和 clang)提供的一个非常有用的扩展。您可以告诉编译器您的函数需要一个可变参数列表,该列表遵循与在参数列表和 之间标记声明check_printf_usage相同的规则:printf__attribute__((format(printf, 1, 2)));
void check_printf_usage(char *fmt, ...) __attribute__((format(printf, 1, 2)));
Run Code Online (Sandbox Code Playgroud)
第一个数字参数1是格式字符串参数从 1 开始的位置,第二个2数字参数 是与格式字符串规范对应的第一个参数的位置。