__attribute__的一些小用法

#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;
}
最近看了看函数的编译属性,还挺有意思,贴上两个用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值