无法理解__attribute__标签

时间:2017-07-06 16:19:27

标签: c++ gcc

extern "C" int asnprintf (char **ret, size_t max_sz, const char *format, ...)
    __attribute__ ((format (printf, 3, 4)));

阅读nmap的源代码我遇到了这个函数声明,我很难理解它。

以下是this webpage对此的说法:

基于

__attribute__((format(printf, m, n)));
  

(m)是“格式字符串”参数的编号,(n)是第一个可变参数的编号。

我不明白他在说“格式字符串”时所指的是什么;它们只是影响函数行为的参数吗?

另外,第一个可变参数的数量是多少?在我看到的所有例子中,它总是比m多一个,这总是如此吗?你能举出一个实际的例子吗?

感谢。

2 个答案:

答案 0 :(得分:1)

extern "C" int asnprintf (char **ret, size_t max_sz, const char *format, ...)
                               ^1              ^2               ^3        ^4
  

在说"格式化字符串&#34 ;;时,我不明白他所指的是什么。它们只是影响函数行为的参数吗?

格式字符串是您通常在printf中找到的格式字符串,例如"%0.3f %s" ecc。当然,这个功能会相应地发挥作用。

  

另外,第一个可变参数的数量是多少?在我看到的所有例子中,它总是超过m,这总是如此吗?你能举出一个实际的例子吗?

在这种情况下,m = 3n = 4,但不一定如此。我们说你有

int blablabla(const void *const data, const char *format, int data, ...)

然后m = 2n = 4

答案 1 :(得分:1)

答案在gcc手册中:

  

format属性指定函数采用printf,scanf,   应该进行类型检查的strftime或strfmon样式参数   对于格式字符串。

     

格式(archetype,string-index,first-to-check)

     

参数archetype确定格式字符串的方式   解释,应该是printf,scanf,strftime或strfmon。 (您   也可以使用 printf scanf strftime strfmon 。)   参数string-index指定哪个参数是格式字符串   参数(从1开始),而first-to-check是数字   检查格式字符串的第一个参数。对于其中的功能   参数无法检查(例如vprintf),   将第三个参数指定为零。在这种情况下只编译器   检查格式字符串是否一致。对于strftime格式,   第三个参数必须为零。自从非静态C ++方法   有一个隐含的这个论点,这些方法的论据应该   当给出string-index和的值时,从两个而不是一个计算   第一 - 校验。