#include <iostream>
using namespace std;
//============================part 1st =======================================
//format
//===========================================================================
//
/*
* __attribute__属性可以给被声明的函数加上类似printf或者scanf的特征,
* 它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。
* 该功能十分有用,尤其是处理一些很难发现的bug。
* format的语法格式为:
* format (archetype, string-index, first-to-check)
* format属性告诉编译器,按照printf, scanf,
* strftime或strfmon的参数表格式规则对该函数的参数进行检查。
* archetype指定是哪种风格;string-index指定传入函数的第几个参数是格式化字符串;
* first-to-check指定从函数的第几个参数开始按上述规则进行检查。
* 具体使用格式如下:
* __attribute__((format(printf,m,n)))
* __attribute__((format(scanf,m,n)))
* 其中参数m与n的含义为:
* m:第几个参数为格式化字符串(format string);
* n:参数集合中的第一个,即参数...里的第一个参数在函数参数总数排在第几
*
*/
void myPrint(char *strFormat, ...)
{
return;
}
int main_format()
{
#ifdef _ADD_ATTRIBUTE
void myPrint(char *strFormat, ...)__attribute__((format(printf,1,2)));
#endif
myPrint("%d", 41);
myPrint("%s", 41);
myPrint("%c", 41);
return 0;
}
//============================part 1st =======================================
//noreturn
//===========================================================================
//
/*
* __attribute__ noreturn
* 该属性通知编译器函数从不返回值,当遇到类似函数需要返回值而却不可能运行到
* 返回值处就已经退出来的情况,该属性可以避免出现错误信息。
* C库函数中的abort()和exit()的声明格式就采用了这种格式,如下所示:
*
* extern void exit(int) __attribute__((noreturn));
* extern void abort(void) __attribute__((noreturn));
*/
# ifndef _ADD_ATTRIBUTE
int myExit(int) __attribute__( (noreturn) );
# else
int myExit(int);
# endif
int main_exit(int rtn)
{
if (rtn) {
myExit(rtn);
}
else
return 0;
}
int myExit(int a)
{
exit(a);
}
int main()
{
main_format();
main_exit(1);
return 0;
}
最近看了看函数的编译属性,还挺有意思,贴上两个用法。
__attribute__的一些小用法
最新推荐文章于 2024-07-25 23:36:45 发布