GCC编译关键字“__attribute_…
2013-12-19 20:34
363 查看
原文地址:GCC编译关键字“__attribute__”(转载)作者:joee33直接引入我们的主角(粗体部分):
my_printf是一个你自己写的函数,比如可能是对vsnprintf等函数进行了封装等等。粗体部分关键字“__attribute__”可以为函数声明赋属性值,其目的是让编译程序可以优化处理。
关键字“__attribute__”可以为函数(Function Attributes),变量(Variable Attributes)和结构成员(Type Attributes)赋属性。具体可以查看gcc手册(http://gcc.gnu.org/onlinedocs/)。这里用到的是函数属性,其语法为:“__attribute__ ((attribute-list))”,并置于函数声明尾部“;”之前。
format (archetype,
string-index, first-to-check)
format属性告诉编译器,按照printf, scanf, strftime或strfmon的参数表格式规则对该函数的参数进行检查。“archetype”指定是哪种风格;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。
例如:上述例子中,函数my_printf对其参数按“printf”的参数格式进行检查,my_printf的第二个参数的格式化字符串,从my_printf的第三个参数开始进行检查。
还有,在编译时只用指定了-Wformat选项,才会出现警告信息。(我们一般都是-Wall的,没问题)
这样,利用这样一个GCC的编译关键字就能在编译时对你指定的函数进行某种规则检查。赶快行动,在你的程序中加入这些,让编译器来为你做检查吧。(我在程序中加入这些,马上编译,立刻就发现一个long型变量使用%d进行格式化的错误)
引出的一个题外话:如果上述函数my_printf是一个类的成员函数,那么上述声明就应该写成:
为什么现在是3,4?
因为类成员函数有一个隐含的参数“this”指针作为函数的第一个参数。(C++基础,寒!自己看了半天都没看出来,还是向ruiheng老大请教才明白)
作者Blog:http://blog.csdn.net/hustxxb/
int
my_printf (void *my_object, const char *my_format, ...)
__attribute__ ((format (printf, 2, 3)));
my_printf是一个你自己写的函数,比如可能是对vsnprintf等函数进行了封装等等。粗体部分关键字“__attribute__”可以为函数声明赋属性值,其目的是让编译程序可以优化处理。
关键字“__attribute__”可以为函数(Function Attributes),变量(Variable Attributes)和结构成员(Type Attributes)赋属性。具体可以查看gcc手册(http://gcc.gnu.org/onlinedocs/)。这里用到的是函数属性,其语法为:“__attribute__ ((attribute-list))”,并置于函数声明尾部“;”之前。
format (archetype,
string-index, first-to-check)
format属性告诉编译器,按照printf, scanf, strftime或strfmon的参数表格式规则对该函数的参数进行检查。“archetype”指定是哪种风格;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。
例如:上述例子中,函数my_printf对其参数按“printf”的参数格式进行检查,my_printf的第二个参数的格式化字符串,从my_printf的第三个参数开始进行检查。
还有,在编译时只用指定了-Wformat选项,才会出现警告信息。(我们一般都是-Wall的,没问题)
这样,利用这样一个GCC的编译关键字就能在编译时对你指定的函数进行某种规则检查。赶快行动,在你的程序中加入这些,让编译器来为你做检查吧。(我在程序中加入这些,马上编译,立刻就发现一个long型变量使用%d进行格式化的错误)
引出的一个题外话:如果上述函数my_printf是一个类的成员函数,那么上述声明就应该写成:
int
my_printf (void *my_object, const char *my_format, ...)
__attribute__ ((format (printf, 3, 4)));
为什么现在是3,4?
因为类成员函数有一个隐含的参数“this”指针作为函数的第一个参数。(C++基础,寒!自己看了半天都没看出来,还是向ruiheng老大请教才明白)
作者Blog:http://blog.csdn.net/hustxxb/
相关文章推荐
- GCC编译关键字“__attribute_…
- 让GCC编译关键字“__attribute__”给你带来方便
- GCC编译关键字“__attribute__”
- 让GCC编译关键字“__attribute__”给你带来方便
- gcc编译,出现错误:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ........
- gcc __attribute__关键字举例之visibility
- 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】
- gcc __attribute__关键字举例之visibility
- gcc 的__attribute__编译属性
- gcc __attribute__关键字举例之visibility
- GCC___attribute__关键字和字节对齐
- 利用gcc的__attribute__编译属性section子项构建初始化函数表
- gcc的__attribute__编译属性
- 利用gcc的__attribute__编译属性section子项构建初始化函数表
- gcc __attribute__关键字举例之alias
- 利用gcc的__attribute__编译属性section子项构建初始化函数表
- gcc __attribute__关键字举例之constructor/destructor
- GCC使用__attribute__关键字
- gcc的__attribute__编译属性
- [随笔]gcc的__attribute__编译属性