GNU C中__attribute__
__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__的更多相关文章
- GNU C 中零长度的数组【转】
原文链接:http://www.cnblogs.com/dolphin0520/p/3752492.html 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用 ...
- GNU C中的零长度数组
http://blog.csdn.net/ssdsafsdsd/article/details/8234736 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的 ...
- GNU Makefile中的条件控制结构
在常见的编程语言中,使用条件控制结构诸如if ... else if ... else...是很寻常的事情,那么在GNU Makefile中如何使用呢? ifeq ifneq 例如:foo.sh #! ...
- GNU C之__attribute__
__attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...
- 了解甚少的GNU C的__attribute__ 机制
平时忙着赶项目,很多东西都是不求甚解,当工作中遇到的一些比较刁钻的问题时,才发现自己和那些大牛的 差距---内功.熟练码农和码神的最大区别估计就是内功是否深厚了.在自我反思的过程中,也要逐渐的积累一些 ...
- gcc中__attribute__ ((constructor(101)))做成.a库成功链接
1.cpp:------------------------------------------------ #include int test() __attribute__ ((construct ...
- C语言中__attribute__ ((at())绝对定位的应用
C语言中的关键字__attribute__ ,当时大一学C语言中没有接触过,后来工作中搞RFID的蓝牙标签卡开发,用的是MSP430G2332,直接用的是绝对定位: 1 const uint8_t f ...
- GNU linux 中makefile那点事
转自陈皓: http://bbs.chinaunix.net/viewthread.php?tid=408225 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为 ...
- 在GNU Linux中怎样得到一个进程当前的流量
/********************************************************************* * Author : Samson * Date ...
随机推荐
- props简单小栗子
props简单小栗子 可以直接copy查看结果 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 1089 Insert or Merge(25 分)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- springMVC form表单提交多个对象集合--使用ajax提交--前台json格式数据封装方法
(function ($) { $.fn.serializeJson = function () { var jsonData1 = {}; var serializeArray = this.ser ...
- Git 2016视频教程
http://blog.csdn.net/biggbang/article/details/50830331
- windows7安装完上不了网
安装完Windows7后发现上不了网,网卡驱动没有安装的原因:但是没有网怎么下载驱动呢,,先装一个网卡版驱动精灵(貌似叫驱动精灵万能网卡版)什么的安装一个网卡驱动,就解决了
- OpenStack Cirros
Cirros Openstack的开发,基本都使用这个image来测试,因为他比较小,只有10M. 镜像介绍 镜像的地址: https://launchpad.net/cirros/trunk/0.3 ...
- Zookeeper启动失败:java.net.BindException: Address already in use
错误日志如下: [hadoop@master zookeeper-3.4.5-cdh5.10.0]$ cat zookeeper.out 2018-05-15 01:29:21,036 [myid:] ...
- 用CSS控制图片大小显示的方法
图片自动适应大小是一个非常常用的功能,在进行制作的时候为了防止图片撑开容器而对图片的尺寸进行必要的控制,我们可不可以用CSS控制图片使它自适应大小呢? 可以通过按比例缩小或者放大到某尺寸(自己指定), ...
- Ionic 解决gradle下载慢的问题
问题 使用Ioinc添加安卓平台或者编译的时候,提示gradle-XXX-all.zip下载,此进度缓慢. 解决 下载gradle对应的zip文件. 参考资源:http://services.grad ...
- MySQL 返回指定长度的字符串
今天在做 iblog 项目时,有一个需求是,从 MySQL 返回某个字段的值要时要指定长度,上网搜到的方法是使用 MySQL 的字符串处理函数,如 left(str, length),right(st ...