字符串的表示形式
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")));
- 申明cpu_mmc_init是__def_mmc_init的一个别名
- 如果cpu_mmc_init没有定义,则使用的是2 __def_mmc_init,如果有定义则,使用就是cpu_mmc_init本身。
- __def_mmc_init函数是一定要有定义的。
- 指定weak属性:即使cpu_mmc_init函数没有定义,调用cpu_mmc_init编译器也是不会报错的
- weak一般会和alias属性连用。
- unused
指定这个变量或者函数如果没有被使用也不要输出警告信息。
static void func(void) __attribute__((unused));
static void func(int a,int b __attribute__((unused)),int c);
- section 指定链接section
-
指定该函数或者是变量最后链接在我们的指定段中
-
链接脚本中使用的Section名其实就是一个变量的形式,不需要定义的,能够直接用,也就是说,我们可以在连接脚本中随意使用一个段名
-
默认未指定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