GNU C语言扩展

__attribute__

_attribute__是GCC编译器提供的一种语法扩展,用于指定变量、函数、结构体等的属性。通过__attribute__可以告诉编译器一些额外的信息,从而优化代码或生成更好的代码。

attribute 书写特征是:attribute 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。attribute 语法格式为:attribute ((attribute-list))

 1. __attribute__((packed))

    这个属性告诉编译器取消结构体中成员之间的内存对齐,使得结构体的大小最小。这个属性通常用于网络编程中,将数据封装成二进制流传输时可以减小数据的大小。

    示例代码:

    struct __attribute__((packed)) Person {

    char name[20];

    int age;

    };

 2. __attribute__((noreturn))

      noreturn 为函数声明,无返回值。 这个属性用于告诉编译器函数不会返回,比如exit函数和abort函数。这样编译器就可以在函数调用点后面省略一些代码,以提高程序运行效率。

    示例代码:

    void __attribute__((noreturn)) my_exit(int status) {

    // 执行一些清理工作

    exit(status);

    }

如果不加  __attribute__((noreturn)); ,运行 gcc -Wall 当前源文件.c。因为加了 -Wall , 所以会有警告信息. 

现在加  __attribute__((noreturn));  警告信息也不会有了。

3. __attribute__((aligned(n)))

    这个属性告诉编译器变量需要按照n字节对齐。n必须是2的幂,通常是2、4、8或16字节。这个属性可以用于优化内存访问的效率,但是会增加内存的消耗。

    示例代码:

    int __attribute__((aligned(16))) a[4];

    4. __attribute__((section('name')))

    这个属性用于将变量或函数放到指定的段(section)中。段是一种内存区域,程序在运行时可以根据需要将段加载到内存中。这个属性通常用于嵌入式系统的开发,可以将一些特定的代码和数据放到特定的段中,以便于管理和使用。

    示例代码: 

#define MACHINE_START(_type,_name)			\

static const struct machine_desc __mach_desc_##_type	\
 __used							\
 __attribute__((__section__(".arch.info.init"))) = {	\
	.nr		= MACH_TYPE_##_type,		\
	.name		= _name,
 
#define MACHINE_END			

    5. __attribute__((weak))

    这个属性用于将函数或变量声明为弱符号。弱符号在链接过程中优先选择强符号,如果没有强符号则使用弱符号。这个属性通常用于编写可插拔的代码,可以在编译时选择使用特定的函数或变量。

    示例代码:

    int __attribute__((weak)) c = 0;

扩展内建函数

 内建,即编译器自带的,不需要引入头文件,如 int、main 、struct 都是内建的。

         内建函数也是如此,函数是编译器自带的,不需要引入头文件,主要用于性能优化。

         以下的 C 标准库函数,其实都是内建函数,不需要引入头文件即可使用。

  • 内存相关函数:memcpy 、memset、memcmp
  • 数学函数:log、cos、abs、exp、
  • 字符串处理函数:strcat、 strcmp、strcpy 、 strlen
  • 打印函数:printf、scanf、putchar、puts

      条件是,加前缀 __builtin_。

      如:__builtin_puts( )、__builtin_memcpy( ),有一些出于安全、性能方面考虑,参数个数和 C 标准库函数不太一样,因为 C 标准库函数的函数不安全,如 strcpy() 、memcpy( )、scanf( )、gets( )。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值