`
pleasetojava
  • 浏览: 729456 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

__attribute__ format

阅读更多

This __attribute__ allows assigning printf-like or scanf-like characteristics to the declared function, and this enables the compiler to check the format string against the parameters provided throughout the code. This is exceptionally helpful in tracking down hard-to-find bugs.

There are two flavors:

  • __attribute__((format(printf,m,n)))
  • __attribute__((format(scanf,m,n)))

but in practice we use the first one much more often.

The (m) is the number of the "format string" parameter, and (n) is the number of the first variadic parameter. To see some examples:

/* like printf() but to standard error only */
extern void eprintf(const char *format, ...)
	__attribute__((format(printf, 1, 2)));  /* 1=format 2=params */

/* printf only if debugging is at the desired level */
extern void dprintf(int dlevel, const char *format, ...)
	__attribute__((format(printf, 2, 3)));  /* 2=format 3=params */

With the functions so declared, the compiler will examine the argument lists

$ cat test.c
1  extern void eprintf(const char *format, ...)
2               __attribute__((format(printf, 1, 2)));
3
4  void foo()
5  {
6      eprintf("s=%s\n", 5);             /* error on this line */
7
8      eprintf("n=%d,%d,%d\n", 1, 2);    /* error on this line */
9  }

$ cc -Wall -c test.c
test.c: In function `foo':
test.c:6: warning: format argument is not a pointer (arg 2)
test.c:8: warning: too few arguments for format

Note that the "standard" library functions - printf and the like - are already understood by the compiler by default.

分享到:
评论

相关推荐

    GCC的__attribute__扩展功能

    extern void myprint(int l,const char *format,...) __attribute__((format(printf,2,3))); 需要特别注意的是,如果 myprint 是一个类的成员函数,那么 m 和 n 的值可有点“悬乎”了,例如: extern void myprint...

    GNU_CC中的attribute

    因此,如果`myprint`接受一个整型`l`和一个格式字符串`format`以及可变参数,作为成员函数时,我们应使用`__attribute__((format(printf, 2, 3)))`,因为`this`指针占用了第一个参数的位置。 以下是一个简单的示例...

    attribute详细介绍

    extern void myprint(const char *format, ...) __attribute__((format(printf, 1, 2))); void test() { myprint("i=%d\n", 6); // 正确 myprint("i=%s\n", 6); // 错误,因为第二个参数不是指针 myprint("i=%s\...

    __attribute__

    extern void myprint(const char *format, ...) __attribute__((format(printf, 1, 2))); ``` 这里的 `myprint` 函数与 `printf` 类似,接受一个格式化字符串作为第一个参数 (`m=1`),并从第二个参数开始 (`n=2`) ...

    __attribute__ - NSHipster.pdf

    例如,使用 __attribute__((availability(macosx,introduced=10.4,deprecated=10.6))) 指令可以指定函数的可用性信息,而使用 __attribute__((noreturn, format(printf, 1, 2))) 指令可以指定函数的返回性质和格式...

    feature_vectors_convert_arff_format-Drebin:feature_vectors_convert_arff_format-Drebin

    标题 "feature_vectors_convert_arff_format-Drebin" 暗示了这个项目是关于将特征向量转换为ARFF(Attribute-Relation File Format)格式,这通常与数据挖掘和机器学习有关,特别是针对Drebin数据集。Drebin是一个...

    Serial-VC++6

    hCom=CreateFile(name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); if(INVALID_HANDLE_VALUE==hCom) { // errLog.Format("create com file faild,port...

    Laravel开发-attribute-manipulation

    return Carbon\Carbon::parse($value)->format('Y-m-d'); } ``` 这样,当你调用`$post->published_at`时,Laravel会自动调用这个访问器并返回格式化的日期。 2. **修改器(Mutators)**:修改器则是在设置属性...

    XmlFormat.rar

    `XmlFormat.rar`显然提供了一个工具,帮助用户更方便地管理和格式化XML文档。这个工具可能包括了将混乱的XML代码整理得整洁易读的功能,这对于开发者来说尤其有用,因为他们需要经常处理XML数据。 XML的基本结构...

    thl_r16_tinav2.0_hm1375验证通过_增加打印设备ID_20170824_1447.7z

    ret = sysfs_create_group(&dev->pdev->dev.kobj, &vfe_attribute_group); #ifdef CONFIG_ES dev->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; dev->early_suspend.suspend = vfe_early_suspend...

    LDAP Format

    **LDIF** (LDAP Data Interchange Format) 是一种用于交换LDAP目录服务中的数据的文本文件格式。LDIF文件由一系列目录条目组成,每个条目之间以空白行分隔。每个LDIF条目包含了以下几部分: 1. **Entry ID(可选)*...

    CUDA_Driver_API.pdf

    6. **CUarray_format**: 定义了数组格式,如CU_AD_FORMAT_UNSIGNED_INT8等。 7. **CUcomputemode**: 计算模式,如CU_COMPUTEMODE_DEFAULT等。 8. **CUctx_flags**: 上下文标志位。 9. **CUdevice_attribute**: 设备...

    hm1375_tinav2.1验证通过_增加设备ID的读取显示_20170825_1333没有外层目录.7z

    ret = sysfs_create_group(&dev->pdev->dev.kobj, &vfe_attribute_group); #ifdef CONFIG_ES dev->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; dev->early_suspend.suspend = vfe_early_suspend...

    init_array教程

    在Linux和类Unix系统中,`init_array`是ELF(Executable and Linkable Format)文件类型的一部分,它是一个特殊的段,用于存放程序启动时需要执行的一系列初始化函数指针。这个教程将深入探讨`init_array`的概念、...

    XML_dom4j_解析器 jar包

    Attribute attribute = root.attribute("attribute_name"); attribute.setValue("new_value"); // 删除元素 Element toRemove = elements.get(0); toRemove.detach(); ``` 4. **保存XML文档**:完成操作后,可以...

    Delphi 获取文件访问时间.rar

    Delphi 获取文件访问时间,也主是最后一次打开文件 的时间,... Result:=Format('%d年%d月%d日 %2.2d:%2.2d:%2.2d',[STime.wYear,STime.wMonth,STime.wDay,STime.wHour,STime.wMinute,STime.wSecond]);  end;  end;

    italian_job:ActiveModel验证程序,用于处理典型的意大利业务问题

    validates :my_attribute , presence : true , codice_fiscale_format : true end 可用的验证器 codice_fiscale_format :意大利税码称为“ Codice Fiscale”。 有关更多信息,请参见 。 partita_iva_format :...

    使用CAtlFile写文件

    - 利用`CAtlString::Format`方法格式化日志信息,包括日期、时间及日志内容。 4. **文件操作**: - `oFile.Create`用于打开或创建文件,如果文件已存在,则打开并清空文件内容;如果不存在,则创建新文件。 - `...

    C语言对HDF文件数据集和属性的读写[文].pdf

    本文主要介绍了使用C语言对HDF( Hierarchical Data Format)文件进行数据集和属性的读写操作。HDF文件是一种高效的数据存储格式,广泛应用于科学计算、数据分析和数据存储等领域。 一、 HDF文件的读取 在读取HDF...

Global site tag (gtag.js) - Google Analytics