__attribute__基本介绍:
1. __attribute__ 可以设置函数属性、变量属性和类型属性。
2. __attribute__ 语法格式为:__attribute__ ((attribute-list))
attribute-list为相应的__attribute__参数,常见的有 aligned、packed、noreturn
3. __attribute__的放置位置为 申明的尾部 即";" 之前。
4. 在使用__attribute__ 参数时,你也可以在参数的前后都
加上“__” (两个下划线),例如,使用__aligned__而不
是aligned ,这样,你就可以在相应的头文件里使用它而不
用关心头文件里是否有重名的宏定义。 常用参数介绍(在32位Ubuntu系统上测试):
1. aligned
该属性设定一个指定大小的对齐格式(以字节为单位): struct foo {
short s;
}__attribute__((aligned(8))); 以上申明将要求编译器确保struct foo类型在空间分配时以8字节对齐方式。
sizeof(short)大小为2,在未加__attribute__((aligned(8)))限制是此结构体大小为2,加了后,要求8字节对齐则大小变为8。
由上述还可得知,我们可以自己手动指定要对齐的字节数。 2. packed:
aligned 属性使被设置的对象占用更多的空间,相反的,使用packed 可以减小对象占用的空间。它将结构体中的每个数据结合在一起。 struct foo
{
short s;
char c;
}__attribute__((packed)); sizeof(short)大小为2,sizeof(char)大小为1,在未加__attribute__((packed))限制时此结构体大小为4,加了后,要求每个数据结合在一起则大小变为3,减小了储存空间。 3. noreturn:
该属性通知编译器函数从不返回值,当遇到类似函数需要返
回值而却不可能运行到返回值处就已经退出来的情况,该属
性可以避免出现错误信息。C库函数中的abort()和exit()
的声明格式就采用了这种格式,如下所示:
extern void exit(int) __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn)); 举例:
void func_1() {
printf("author-->Flying\n");
} extern void func_1();
int func_2(int n) {
if (n > 0) {
func_1();
} else {
return 0;
}
}
编译时会出一个警告:
warning: control reaches end of non-void function
警告信息也很好理解,因为你定义了一个有返回值的函数
func_2却有可能没有返回值,程序当然不知道怎么办了!
加上__attribute__((noreturn))则可以很好的处理
类似这种问题。 解决方法:
extern void func_1() __attribute__((noreturn));
之后,编译不会再出现警告信息
参考文档:
http://www.cnblogs.com/astwish/articles/3460618.html

GNU C中__attribute__的更多相关文章

  1. GNU C 中零长度的数组【转】

    原文链接:http://www.cnblogs.com/dolphin0520/p/3752492.html 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用 ...

  2. GNU C中的零长度数组

    http://blog.csdn.net/ssdsafsdsd/article/details/8234736 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的 ...

  3. GNU Makefile中的条件控制结构

    在常见的编程语言中,使用条件控制结构诸如if ... else if ... else...是很寻常的事情,那么在GNU Makefile中如何使用呢? ifeq ifneq 例如:foo.sh #! ...

  4. GNU C之__attribute__

    __attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...

  5. 了解甚少的GNU C的__attribute__ 机制

    平时忙着赶项目,很多东西都是不求甚解,当工作中遇到的一些比较刁钻的问题时,才发现自己和那些大牛的 差距---内功.熟练码农和码神的最大区别估计就是内功是否深厚了.在自我反思的过程中,也要逐渐的积累一些 ...

  6. gcc中__attribute__ ((constructor(101)))做成.a库成功链接

    1.cpp:------------------------------------------------ #include int test() __attribute__ ((construct ...

  7. C语言中__attribute__ ((at())绝对定位的应用

    C语言中的关键字__attribute__ ,当时大一学C语言中没有接触过,后来工作中搞RFID的蓝牙标签卡开发,用的是MSP430G2332,直接用的是绝对定位: 1 const uint8_t f ...

  8. GNU linux 中makefile那点事

    转自陈皓: http://bbs.chinaunix.net/viewthread.php?tid=408225 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为 ...

  9. 在GNU Linux中怎样得到一个进程当前的流量

    /*********************************************************************  * Author  : Samson  * Date   ...

随机推荐

  1. 【ACM】最长公共子序列 - 动态规划

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...

  2. 非关系型数据库---Memcached

    一.概述 1.Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载: 2.Memcached通过 在内存中缓存对象和数据 来减少读取数据库的次数,从而提升网站的 ...

  3. Docker 镜像制作 CentOS+JDK+Tomcat

    [root@localhost createImages]# ls apache-tomcat-.tar.gz server-jre-8u121-linux-x64.tar.gz [root@loca ...

  4. (转)linux下文件删除的原理精华讲解(考试题答案系列)

    linux下文件删除的原理精华讲解(考试题答案系列) 说明:本文为老男孩linux培训某节课前考试试题及答案分享博文内容的一部分,也是独立成题的,你可以点下面地址查看全部的内容信息.http://ol ...

  5. (转)Linux网络接口配置文件ifcfg-eth0解析

    原文:http://blog.51cto.com/xtbao/1671739 https://www.cnblogs.com/arvintang/p/5990599.html http://blog. ...

  6. 系统启动时,BIOS与影子内存_5

    问题:“当我们按下电源开关时,电源开始供电,芯片组撤去RESET信号,CPU马上就从地址FFFF0H处开始执行指令,这个地址在系统BIOS的地址范围内,无论是Award BIOS还是AMI BIOS, ...

  7. Docker | 第五章:构建自定义镜像

    前言 上一章节,主要是介绍了下Dockerfile的一些常用命令的说明.我们知道,利用Dockerfile可以构建一个新的镜像,比如运行Java环境,就需要一个JDK环境的镜像,但直接使用公共的镜像时 ...

  8. Android入门:封装一个HTTP请求的辅助类

    前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求: 此处我封装了一个HTTP的get和post的辅助类,能够更好的使用: 类名:HttpRequestUtil 提供了如下功能: ( ...

  9. ElasticSearch:华为云搜索CSS 之POC操作记录

    2019/03/06 09:00 ES文档官方:https://support.huaweicloud.com/usermanual-es/es_01_0024.html 华为云区域:华北北京1 ES ...

  10. 七、SSR(服务端渲染)

    使用框架的问题 下载Vue.js 执行Vue.js 生成HTML页面(首屏显示,依赖于vue.js的加载) 以前没有前端框架时,用jsp/php在服务器端进行数据的填充,发送给客户端就是已经填充好的数 ...