GCC 的一些特性

字符串的表示形式

gcc支持的一种的字符串的表示形式

“xxx” “xxx” “xxx”
会将这3个字符串连成一个并 且只会在最后的一个字符串末尾添加 ‘\0’,而且还会忽略各个字符串之间的空格符号。

attribute

_attribute__实际上是gcc专有的一种语法,是用来设置设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)的语法

语法

attribute (parameter)
int a __attribute__ ((xxxxx)); 
结构类型属性
struct info{
.....
} __attribute__ ((xxxxx)) sb;
  • aligned
    对齐
//指定struct fd类的字节对齐方式
struct fd{
   
...
}__sttribute__ ((align(4))) fd;
  • packed
    用packed修饰后,变为1字节对齐
typedef struct {
    char    version;
    int16_t sid;
    int32_t len;
    int64_t time;
}__attribute__ ((packed)) Header;
函数属性(Function Attribute)
    noreturn
    noinline
    always_inline
    pure
    const
    nothrow
    sentinel
    format
    format_arg
    no_instrument_function
    section
    constructor
    destructor
    used
    unused
    deprecated
    weak
    malloc
    alias
    warn_unused_result
    nonnull 
weak , alias
  • alias 别名 weak
//申明
int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
  1. 申明cpu_mmc_init是__def_mmc_init的一个别名
  2. 如果cpu_mmc_init没有定义,则使用的是2 __def_mmc_init,如果有定义则,使用就是cpu_mmc_init本身。
  3. __def_mmc_init函数是一定要有定义的。
  4. 指定weak属性:即使cpu_mmc_init函数没有定义,调用cpu_mmc_init编译器也是不会报错的
  5. weak一般会和alias属性连用。
  • unused
    指定这个变量或者函数如果没有被使用也不要输出警告信息。
static void func(void) __attribute__((unused));
static void func(int a,int b __attribute__((unused)),int c);
  • section 指定链接section
  1. 指定该函数或者是变量最后链接在我们的指定段中

  2. 链接脚本中使用的Section名其实就是一个变量的形式,不需要定义的,能够直接用,也就是说,我们可以在连接脚本中随意使用一个段名

  3. 默认未指定section属性时,如果已初始化,则存入.data段;否则存入.bss段。 如果指定section属性,则无论是否初始化,都存入指定段。

//__init
#define __init __attribute__ ((__section__ (".init.text"))) __cold
//__initdata
#define __initdata __attribute__ (( __section__ (".init.data")))
//__exitdata
#define __exitdata __attribute__ (( __section__ (".exit.data")))

[23] .data PROGBITS 0000000000600900 00000900
0000000000000004 0000000000000000 WA 0 0 4
[24] .init.data PROGBITS 0000000000600904 00000904
0000000000000018 0000000000000000 WA 0 0 4
[25] .bss NOBITS 0000000000600920 0000091c
0000000000000010 0000000000000000 WA 0 0 8
  • noreturn
    主要的功能用来告诉编译器,调用了__attribute__(noreturn)的函数后,控制不会再返回caller
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值