C 语言的 GCC 扩展

GNU 编译器(GCC)提供了很多 C 语言扩展,编译器会使用该信息生成更高效的机器代码。

内联函数

static inline __attribute__ ((always_inline)) int foo(void) { /* ... */ }

避免内联

__attribute__ ((oninline)) int foo(void) { /*...*/ }

纯函数

__attribute__ ((pure)) int foo(int val) { /* */ }

返回值只受函数参数或 nonvolatile 全局变量影响。

常函数

__attribute__ ((const)) int foo(int val) { /*...*/ }

常函数是一种严格的纯函数。常函数不能访问全局变量,参数不能是指针类型。因此,常函数的返回值只和值传递的参数值有关。

没有返回值的函数

__attribute__ ((noreturn)) void foo(int val) { /*...*/ }

分配内存的函数

__attribute__ ((malloc)) void *copy()
{
   int size = 10;
   return malloc(10);
}

强制调用方检查返回值

 1 #include <stdio.h>
 2
 3 __attribute__ ((warn_unused_result)) int foo()
 4 {
 5     return 0;
 6 }
 7
 8 int main()
 9 {
10     foo();
11     return 0;
12 }

把函数标识为“Deprecated(已废弃)”

__attribute__ ((deprecated)) void foo(void) { /*...*/ }

把函数标识为已使用

static __attribute__ ((used)) void foo(void) { /*...*/ }

把函数或参数标识为未使用的

int foo(int __attribute__ ((unused)) value) { /*...*/}

对结构体进行紧凑存储(pack)

struct __attribute__ ((packed)) foo { ... };

packed 属性告诉编译器一个类型或变量应该在内存中紧凑存储,使用尽可能少的空间,可能不依赖对齐需求。如果在结构体(struct)或联合体(union)上指定该属性,就需要对所有变量进行紧凑存储。如果只是对某个变量指定该属性,就只会紧凑存储该特定变量。

时间: 2024-08-30 08:01:26

C 语言的 GCC 扩展的相关文章

GCC扩展(转--对看kernel代码有帮助

Linux Kernel的代码,上次就发现一个结构体的定义形式看不懂,后来才知道它用的不是标准的ANSI C,而是GCC的一些扩展.刚好看到<Linux内核修炼之道>中对GCC扩展有所描述,转载一下吧,对看kernel代码有所帮助. 3.5内核代码的特点 Linux内核同时使用C语言和汇编语言实现,C语言编写的代码移植性较好.易于维护,而汇编语言编写的代码相当于针对特定的平台做了优化,速度较快,所以需要在它们之间寻找一定的平衡. 一般而言,在体系结构的底层或对执行时间要求严格的地方,会使用汇编

GCC 扩展内联汇编简介

基本内联汇编 基本内联汇编格式比较直观,可以直接这样写: asm("assembly code"); 例如: asm("movl %ecx, %eax"); /* 把 ecx 内容移动到 eax */ __asm__("movb %bh , (%eax)"); /* 把bh中一个字节的内容移动到eax指向的内存 */ 扩展内联汇编 前面讨论的基本内联汇编只涉及到嵌入汇编指令,而在扩展形式中,我们还可以指定操作数,并且可以选择输入输出寄存器,以及指

linux内核宏container_of前期准备之gcc扩展关键字typeof

typeof基本介绍 1 typeof(x) 这是它的使用方法,x可以是数据类型或者表达式.它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会解释. 当x是数据类型时,它和关键字typedef很相似,只不过typedef是要先定义再使用,而typeof则是可立即使用的,如下: 1 typedef int INT; 2 int main(int argc, const char *argv[]) 3 { 4 INT a; 5 typeo

Notepad++编译和运行C语言 (GCC)

我们在学习C语言的时候,实际上只需要编译器和编辑器就能开搞了.(初学者过早接触IDE不利于理解程序构建的过程) 在看这篇文章的时候,假设你已经知道如何把GCC配置到环境变量,并且会在命令行/终端下使用gcc 编译C代码文件 并运行了. 关于notepad++ notepad++是款windows下优秀的编辑器.在windows环境下,装了notepad++和gcc就能愉快地开始C语言学习之旅了. 这里当然再废话一下,系统自带的notepad记事本当然也可以写C语言,不过因为记事本不带语法高亮以及

C语言之gcc中支持的内存对齐指令

1:gcc中支持但不推荐使用的指令 #pragma pack() :取消内存对齐访问 #pragma pack(n) (n=1/2/4/8):按n字节对齐 #pragma pack(2)  struct mystruct1 { int a; char b; short c; } struct mystruct2 { int a;; double b; short c; }  #pragma pack() 以上这部分内容就是按2字节对齐了. 分析: (1)#pragma是用来指挥编译器,或者说设置

Object-C语言类的扩展

一.Category      1.Category:也叫分类,类目.是为没有源代码的类扩充功能.扩充的功能会成为原有类的一部分,可以通过原有类或者原有的对象直接调用,并且可继承. 2.注意: 1)该方式只能扩充方法,不能扩充实例变量,@property(可能编译不报错,但是运行有问题). 2)分类可以访问原来类中的成员. 3)如果分类和原来类出现同名的方法,优先调用分类中的方法,原来类中的方法会被忽略. 4)多个类目中有同名的方法的时候执行的是最后编译的那个类目的同名方法. 二.Extensi

最简单语言理解Array扩展的新方法,map,reduce,filter,forEach

一直以来很多人对这4个方法都不是很熟悉,也不太会用,网上的很多教程写的都模模糊糊(程序员们的表达能力太弱,原谅他们吧) 所以今天我打算用最简单的语言来说清楚这4个东西 map:说白了就是一一对应,进去10个,出来10个,不多不少刚刚好 比如上学那会的考试成绩,[62, 55, 98],对应的另外一层含义就是 [及格,不及格,优秀],数组一一对应,只是换了个方法展示 reduce:意思就是减少(翻译也是减少),说白了就是进去多个,只出来1个 比如一个班级的平均分,不管数组里有多少个数,出来只有1个

R语言的cpp扩展支持Rcpp模块介绍

概述 Rcpp包提供C++类方便C or C++代码与R软件包进行交互,使用R中提供的.Call() 调用界面. Rcpp提供R中的基础数据类型的C++类供访问.包作者可以保持R的数据结构而无需与C++进行不断的转换.同时,这些数据结构提供C++级别的存取.数据类型可以双向映射.可以从 R中把数据赋给C++, 返回数据从C++到R也完全一样.下面列出支持的数据类型. Transfer from R to C++, and from C++ to R R 数据类型 (SEXP) 与C++对象是一致

Java语言学习总结 扩展篇 包装类的概念及其使用

包装类 包装类的概述 Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下: 包装类:基本数据类型,使用起来非常方便,但是没有对应的方法来操作这些基本类型的数据可以使用一个类把基本类型的数据装起来,在类中定义一些方法,这 个类叫做包装类我们可以使用类中的方法来操作这些基本类型的数据 装箱和拆箱 基本类型与对应的包装类对象之间,来回转换的过程称为”装箱