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
多一个,这总是如此吗?你能举出一个实际的例子吗?
感谢。
答案 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 = 3
和n = 4
,但不一定如此。我们说你有
int blablabla(const void *const data, const char *format, int data, ...)
然后m = 2
和n = 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和的值时,从两个而不是一个计算 第一 - 校验。