美文网首页
GCC 扩展

GCC 扩展

作者: bailongxian | 来源:发表于2016-07-17 18:39 被阅读69次

GNU C 允许声明函数、变量和类型的特殊属性,以便手工的代码优化和更仔细的代

码检查。要指定一个声明的属性,在声明后写

__attribute__ (( ATTRIBUTE ))

其中 ATTRIBUTE 是属性说明,多个属性以逗号分隔。GNU C 支持十几个属性,这

里介绍最常用的:

* noreturn

属性 noreturn 用于函数,表示该函数从不返回。这可以让编译器生成稍微优化的

代码,最重要的是可以消除不必要的警告信息比如未初使化的变量。例如:

++++ include/linux/kernel.h

47: # define ATTRIB_NORET  __attribute__((noreturn)) ....

61: asmlinkage NORET_TYPE void do_exit(long error_code)

ATTRIB_NORET;

* format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)

属性 format 用于函数,表示该函数使用 printf, scanf 或 strftime 风格的参

数,使用这类函数最容易犯的错误是格式串与参数不匹配,指定 format 属性可以

让编译器根据格式串检查参数类型。例如:

++++ include/linux/kernel.h?

89: asmlinkage int printk(const char * fmt, ...)

90:         __attribute__ ((format (printf, 1, 2)));

表示第一个参数是格式串,从第二个参数起根据格式串检查参数。

* unused

属性 unused 用于函数和变量,表示该函数或变量可能不使用,这个属性可以避免

编译器产生警告信息。

* section ("section-name")

属性 section 用于函数和变量,通常编译器将函数放在 .text 节,变量放在

.data 或 .bss 节,使用 section 属性,可以让编译器将函数或变量放在指定的

节中。例如:

++++ include/linux/init.h

78: #define __init          __attribute__ ((__section__ (".text.init")))

79: #define __exit          __attribute__ ((unused,

__section__(".text.exit")))

80: #define __initdata      __attribute__ ((__section__ (".data.init")))

81: #define __exitdata      __attribute__ ((unused, __section__

(".data.exit")))

82: #define __initsetup     __attribute__ ((unused,__section__

(".setup.init")))

83: #define __init_call     __attribute__ ((unused,__section__

(".initcall.init")))

84: #define __exit_call     __attribute__ ((unused,__section__

(".exitcall.exit")))

连接器可以把相同节的代码或数据安排在一起,Linux

内核很喜欢使用这种技术,

例如系统的初始化代码被安排在单独的一个节,在初始化结束后就可以释放这部分

内存。

* aligned (ALIGNMENT)

属性 aligned 用于变量、结构或联合类型,指定变量、结构域、结构或联合的对

齐量,以字节为单位,例如:

++++ include/asm-i386/processor.h

294: struct i387_fxsave_struct {

295:         unsigned short  cwd;

296:         unsigned short  swd;

297:         unsigned short  twd;

298:         unsigned short  fop;

299:         long    fip;

300:         long    fcs;

301:         long    foo;

......

308: } __attribute__ ((aligned (16)));

表示该结构类型的变量以 16 字节对齐。通常编译器会选择合适的对齐量,显示指

定对齐通常是由于体系限制、优化等原因。

* packed

属性 packed 用于变量和类型,用于变量或结构域时表示使用最小可能的对齐,用

于枚举、结构或联合类型时表示该类型使用最小的内存。例如:

++++ include/asm-i386/desc.h

51: struct Xgt_desc_struct {

52:         unsigned short size;

53:         unsigned long address __attribute__((packed));

54: };

域 address 将紧接着 size 分配。属性 packed 的用途大多是定义硬件相关的结

构,使元素之间没有因对齐而造成的空洞。

相关文章

  • GCC 扩展

    GNU C 允许声明函数、变量和类型的特殊属性,以便手工的代码优化和更仔细的代 码检查。要指定一个声明的属性,在声...

  • GCC 扩展语法

    具有返回值的复合语句复合语句是大括号包围的语句块,其返回值是复合语句中最后一个表达式的类型和值。例如:int va...

  • C语言 GCC扩展特性

    GCC扩展特性 一般你使用C语言时,使用标准C语法即可,一般很少用到GCC的扩展特性。 Linux内核必须使用GN...

  • 服务器

    一,安装nginx 1.下载 安装前确认安装扩展 没有的直接 yum install wget gcc gcc-c...

  • 2021-02-19 cc/gcc/g++/CC

    gcc全称是Gun C语言编译器。原本只能处理C语言,gcc很快地扩展,现在的gcc可以说是GNU编译器集合(可编...

  • PHP 安装 grpc 扩展报错

    综合分析结果:centos7.7 默认的gcc版本是 4.8 的;然而 php的grpc扩展安装,需要 gcc 4...

  • 安装swoole

    1.使用pecl安装swoole需要安装gcc gcc+2.安装swoole 3.配置php.ini 4.查看扩展...

  • GCC的编译C语言的编译过程

    1. GCC介绍 编写过C和C++的朋友对GCC一定不会陌生,GCC最初是由GNU开发的C语言编译器,后很快扩展,...

  • gcc扩展之类型属性

    引用 gcc5.5 在线手册 属性描述 aligned (alignment) 将结构体的大小与alignment...

  • 20200413 record

    c++编译告警检查clang + llvm(写代码扩展检查项) clangtidy + gcc自带的告警检查(是否...

网友评论

      本文标题:GCC 扩展

      本文链接:https://www.haomeiwen.com/subject/czqpqttx.html