我有以下功能用于记录目的:
void LogE(const char* scope, const char* s, ...) {
fprintf(stderr, "%s : ", scope);
va_list list;
va_start(list, s);
vfprintf(stdout, s, list);
fprintf(stdout, "\n");
va_end(list);
fflush(stdout);
}
它的名字是这样的:
LogE(__func__, "No sufficient memory to add sorted triangle, current capacity (bytes) / requested (bytes): %d (%d) / %d (%d)", renderer->sortedTriangleCap, renderer->sortedTriangleCap * sizeof(SORTED_TRIANGLE));
如果我直接使用
printf
函数族,编译器会抱怨/警告可变参数的数量小于格式字符串中格式说明符的数量。
我可以告诉 C99 中的编译器
const char* s
和 ...
应该相互检查吗?
这可以通过编译器扩展来实现。例如,在 GNU 中,有
__attribute__((format(archetype, string-index, first-to-check)))
,定义如下: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
在您的情况下,您可以将其添加到您的函数中...
void LogE(const char* scope, const char* s, ...)
__attribute__((format(printf, 2, 3)));