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 ...
随机推荐
- Leetcode题解
前言 Leetcode现在弄了一个Weekly Contest,然后题目又会作为新题目:感觉如果现在还不及时刷题的话可能真的赶不上它题目增长的速度了.......题目会在博客和Github上同步更新的 ...
- ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge (状态压缩DP)
Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...
- jap的教程
第一个资料: https://wenku.baidu.com/view/5ca6ce6a1eb91a37f1115cee.html 第二个资料 :http://www.yiibai.com/jpa ...
- (转)Linux最常用指令及快捷键 Linux学习笔记
Linux最常用指令及快捷键 Linux学习笔记 原文:http://blog.csdn.net/yanghongche/article/details/50827478 [摘自 鸟叔的私房菜]--转 ...
- 一般的linux系统默认安装的vim是精简版
一般的linux系统默认安装的vim是精简版(vim-tiny),所以不能配置语法检查等属性或获取在线帮助.需要安装vim-x:x.x.x,vim-common,vim-runtime. :synta ...
- 生产消费者模式与python+redis实例运用(基础篇)
根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃:还有一个选择,做 ...
- 零基础逆向工程25_C++_02_类的成员权限_虚函数_模板
1 类的成员权限 1.1 小结: 1.对外提供的函数或者变量,发布成public的 但不能随意改动. 2.可能会变动的函数或者变量,定义成private的 这样编译器会在使用的时候做检测. 3.只有结 ...
- java.lang.IllegalArgumentException: Document base F:\personal\projects\annoMVC\web does not exist or is not a readable directory
tomcat明明在d盘,怎么到F盘了...纳闷啊... 解决办法: 1停掉Tomcat服务2把/conf/Catalina/localhost下的文件删除掉(我在这个文件夹里发现了一个xml,指向了F ...
- JSON.parse() 和 JSON.stringify()的简单介绍
参考地址: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse ht ...
- git学习(一)
提: 远程的主机名(远程仓库服务器名): origin 本地的主分支: master(本地master分支) 远程的主分支: maste(远程仓库的master分支) gi ...