You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C99下如何让编译器检查自定义日志函数的格式串与可变参数匹配?

在C99中让编译器检查自定义可变参数日志函数的格式匹配

可以实现。C99本身没有强制要求编译器支持可变参数格式检查,但GCC、Clang等主流编译器提供了格式属性扩展,能让编译器像检查printf函数族一样,验证你的LogE函数中格式串与可变参数的匹配关系。

具体实现方法

修改LogE的函数声明,添加__attribute__((format(printf, 2, 3)))属性:

#include <stdio.h>
#include <stdarg.h>

// 格式属性说明:按printf规则,检查第2个参数(格式串)和第3个参数开始的可变参数
void LogE(const char* scope, const char* s, ...) __attribute__((format(printf, 2, 3)));

void LogE(const char* scope, const char* s, ...) {
    fprintf(stderr, "%s : ", scope);
    va_list list;
    va_start(list, s);
    vfprintf(stderr, s, list);
    fprintf(stderr, "\n");
    va_end(list);
    fflush(stderr);
}

属性参数解释

  • printf:指定使用printf风格的格式检查规则;
  • 2:表示格式串是函数的第2个参数(即const char* s);
  • 3:表示可变参数从函数的第3个参数开始。

效果验证

当你传入的参数数量、类型与格式串占位符不匹配时,编译器会直接发出警告。比如你提供的调用代码中,格式串有4个%d占位符,但只传入了2个参数,编译器会输出类似:

warning: format ‘%d’ expects a matching ‘int’ argument

完全和原生printf函数的警告逻辑一致。

注意事项

这个属性是编译器扩展,并非C99标准的一部分,但主流C编译器(GCC、Clang、ICC等)都支持它,在C99开发环境中可以放心使用。

内容的提问来源于stack exchange,提问作者user3001150

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:12:13