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 ...
随机推荐
- C# JObject将json字符串转为json对象
static void Main(string[] args) { string json = "{\"name\": \"测试\",\"m ...
- A*算法的认识与求第K短路模板
现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...
- PHP var_export
var_export可以将一个数组转为一个字符串 不同于var_dump,var_export并不会输出数据的类型以及字符大小等,只会简单把数组的key跟value拼接成一个字符串 <?php ...
- Java实现快排+小坑+partition的两种思路
在做一道剑指Offer的题的时候,有道题涉及到快排的思路,一开始就很快根据以前的思路写出了代码,但似乎有些细节不太对劲,自己拿数据试了下果然.然后折腾了下并记录下一些小坑,还有总结下划分方法parti ...
- arch搭建SVN服务器
一.安装 Install the package Install subversion from the official repositories. Create a repository Crea ...
- 【C#】=>符号的使用
Lambda表达式.Lambda表达式是C#3.0的新内容,如果您之前学习的C#2.0,不认识也就不奇怪了.给您举个例子.例如,我定义一个委托:delegate int Method(int a, i ...
- clipboard JS(剪切板)的使用
引入js(根据路径需要修改url) <script src="lib/clipboard/clipboard.min.js" type="text/javascri ...
- spring batch 以游标的方式 数据库读取数据 然后写入目标数据库
前面关于Spring Batch的文章,讲述了SpringBatch对Flat.XML等文件的读写操作,本文将和大家一起讨论Spring Batch对DB的读写操作.Spring Batch对DB数据 ...
- HTTPS与SSL(一)
1. HTTPS HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版 ...
- 用C++/CLI搭建C++和C#之间的桥梁
一.简单用法 C#和C++是非常相似的两种语言,然而我们却常常将其用于两种不同的地方,C#得益于其简洁的语法和丰富的类库,常用来构建业务系统.C++则具有底层API的访问能力和拔尖的执行效率,往往用于 ...