格式化字符串和可变参数 - 我可以告诉编译器检查它们吗?

问题描述 投票:0回答:1

我有以下功能用于记录目的:

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
...
应该相互检查吗?

c printf variadic-functions c99
1个回答
0
投票

这可以通过编译器扩展来实现。例如,在 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)));
© www.soinside.com 2019 - 2024. All rights reserved.