什么是“__printflike__修饰符”?这个词是什么意思?__printflike__修饰符
回答
猜测它告诉编译器你正在使用一个函数接受形式为[anything, ] format, ...
的参数,其中format, ...
部分看起来像printf
的参数。 __printflike__
属性允许编译器根据字符串格式测试参数列表中的类型。当您编写像log(format, ...)
这样的函数并使用vsprintf
将格式化工作从字符串发送到某些特殊的日志接口之前,将它从属于常用的标准库函数时,会出现这种情况。
如果您使用的GCC那么它可能是一个#define
是在您的项目是这样的:
#define __printflike__ __attribute__((format(printf, 1, 2)))
凡1, 2
意味着format, ...
出现在位置1和2
正是我所期待的!谢谢。 – hari 2011-04-28 22:04:17
大概告诉编译器的相应的功能有printf
-like语义。
这可以使编译器在编译时发出警告,当格式字符串中的修饰符与传递参数的类型或计数不一致时。
有没有其他的方式,编译器可以拥有的知识告诉你,%u
不
我问了反向问题主叫printf
,sprintf
,fprintf
等格式时为int
权前几个月:Are printf/sprintf compiler warnings a conceptual break?
我有一个函数在我的错误报告库中喜欢头部声明:
extern void err_logmsg(FILE *fp, int flags, int estat, const char *format, ...)
PRINTFLIKE(4,5);
PRINTFLIKE是大写字母,因此我可以在不使用GCC时将其定义为无。这个用法表示前三个参数没什么特别,但第四个参数是一个格式字符串,与printf()
使用的格式字符串(实际上,它在内部传递给vfprintf()
)以及与之对应的参数(使用格式字符串格式化)从第五个参数开始。
这意味着,如果I型:
err_logmsg(stdout, ERR_ABORT, 1, "%s: %d\n", errno, strerror(errno));
我会因为errno
是int
和strerror(errno)
返回一个指向字符串得到一个编译错误。我可以通过更改格式字符串或第五个和第六个参数来修复错误。 (ERR_ABORT是定义在同一个标头中的一组标志,声明err_logmsg()
。)
PRINTFLIKE宏中有两个数字,因为格式字符串和格式字符串使用的第一个参数之间可能有其他参数。例如,另一种功能可能是:
extern void err_writer(FILE *fp, const char *format, int flags, int estat, ...)
PRINTFLIKE(2,5);
这告诉编译器格式字符串是第二个参数,但是即得到格式化还是相应的参数出现在开始的第五个参数。
此代码的头文件包含行:
#ifdef __GNUC__
#define PRINTFLIKE(n,m) __attribute__((format(printf,n,m)))
#define NORETURN() __attribute__((noreturn))
#else
#define PRINTFLIKE(n,m) /* If only */
#define NORETURN() /* If only */
#endif /* __GNUC__ */
感谢洛特... – hari 2011-04-28 22:03:20
- 1. __strong修饰符
- 2. '出' 修饰符
- 3. AtTask修饰符
- 4. Vue.js修饰符链
- 5. Java类修饰符
- 6. InputEvent修饰符键
- 7. mvvmlight eventtocommand修饰符
- 8. 范围修饰符
- 9. 只读修饰符
- 10. HyperlinkEvent的修饰符?
- 11. RegisterHotkey Fn修饰符?
- 12. Java访问修饰符:无修饰符与“默认”
- 13. 修饰符无效,修饰符必须是对象错误
- 14. 访问修饰符C# - 内部修饰符
- 15. Java拼图:修饰符
- 16. preg_match(); - 未知的修饰符'+'
- 17. Math.random的概率修饰符()
- 18. 命名组+ x修饰符
- 19. MongoKitten支持$ inc修饰符
- 20. ConcurrentHashMap修饰符的同步
- 21. Delphi访问修饰符
- 22. Python修饰符错误?
- 23. Gtk按键修饰符
- 24. 修饰符下从服务
- 25. 内部访问修饰符
- 26. Swing和最终修饰符
- 27. Java类的修饰符
- 28. 库级访问修饰符
- 29. EventInfo访问修饰符
- 30. 动态访问修饰符
你看到什么情况下它? (和你使用的是什么编译器?) – 2011-04-28 21:30:51
gcc版本4.2.1在unix上。我对这个术语一无所知,并且想要理解它的非常基本的含义。 – hari 2011-04-28 21:36:40
GCC不使用'__printflike__'标识符。它使用语法'__attribute __((format(printf,n,m)))',并且至少有3.3版本。如果它存在于你的代码中,你应该发布一段你看到的代码片段,这样我们可以帮助你更多。 – 2011-04-28 21:42:18