概述
/*
*
*attribute机制 gnu c 一大特色 可以设置函数属性、变量属性、类型属性;
*书写特征:__attribute__(...);
*
*
*/
/******1:函数属性********/
#include <stdio.h>
/********************************************************************/
/**
* 1:函数属性__attribute__format
*
*__attribute__format: format(archetype, string_index, first-to-check);
*
*@archetype:指定是哪一种风格:比如 prinf scanf strftime或strfmon等
*@string_index: 指定传入函数的第几个参数是格式化字符串
*@first-to-check:指定函数的第几个参数开始按上述规则进行检查
*/
#if 0
extern void myprintf(const char *format, ...) __attribute__((format(printf,1,2)));
//如下会进行格式检查
/*
root@ubuntu:/mnt/hgfs/sharefile/attribute# gcc -c attribute.c -o attribute.o -Wall
attribute.c: In function ‘test’:
attribute.c:34:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
attribute.c:38:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
attribute.c:38:2: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat]
*/
void test1()
{
myprintf("1:i = %dn", 6);
myprintf("2:i = %sn", 6);
myprintf("3:i = %sn", "abc");
myprintf("4: %s,%d,%dn", 1,2);
}
int main(int argc, char **agrv)
{
test1();
return 0;
}
#endif
/***************************************************************/
#if 0
/**
* 2:函数属性__attribute__noreturn
* 作用: 当遇到类似函数需要返回值而不可能运行到返回值处就已经退出来的情况
* 该属性可以避免出现错误信息 C语言库 abort函数与exit函数 的声明就采用这种格式
* 如:exit(int) __attribute__((noreturn));
*/
//测试:
extern void myexit() __attribute__((noreturn));
int test2(int n)
{
if (n > 0) {
myexit();
//prinf("首先程序不会执行到我 如果不加__attribute__((noreturn)) 程序执行会有warning");
} else
return 0;
}
int main(int argc, char **agrv)
{
test2(1);
return 0;
}
//执行:如果不加__attribute__((noreturn)) 程序执行会有warning"
/*
root@ubuntu:/mnt/hgfs/sharefile/attribute# gcc -c attribute.c -o attribute.o -Wall
attribute.c: In function ‘test2’:
attribute.c:88:9: warning: ‘return’ with a value, in function returning void [enabled by default]
root@ubuntu:/mnt/hgfs/sharefile/attribute#
*/
#endif
/****************************************************************/
/**
* 3:函数属性__attribute__const
* 该属性只能用于带有数值类型参数的函数上。当重复调用带有数值参数的函数时,由于返回值
*是相同的,所以此时编译器可以进行优化处理,除第一次需要运算外,其他只需要返回第一次的
*结果就可以了,进而可以提高效率,该属性主要适用于没有静态状态(static state *)和副作用的一些函数,并且返回值仅仅依赖输入的参数
*
*需要注意的是:const参数不能用在带有指针类型参数的函数中(如:int fun(char* cha) *,因为该属性不但会影响函数的参数值,同样也影响参数执向的数据
*/
/**
//首先const作用域测试
void test1()
{
const int con = 222; //作用于本函数
const static int con2 = 222; //作用于本函数
static const int con3 = 222; //作用于本函数
}
void test2()
{
printf("con = %d",con); //con 没有发现
printf("con2 = %d",con2); //con 没有发现
printf("con3 = %d",con3); //con 没有发现
}
int main(int argc, char **agrv)
{
test1();
test2();
return 0;
}
**/
#if 0
//声明
extern int square(int n) __attribute__((const));
void test3()
{
int i;
for (i = 0; i < 100; i++) {
//重复调用一个带有相同参数值的函数,通过添加“__attribute__((const))” 编译器只调用了square函数一次,以后只是得到了相同的一个返回值
total += square(5)+i;
}
}
int main(int argc, char **agrv)
{
test3();
return 0;
}
#endif
/*******************************************************************/
/*.... 待续.... */
最后
以上就是无限猫咪为你收集整理的GNU C __atttibute__ 机制的全部内容,希望文章能够帮你解决GNU C __atttibute__ 机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复