1.链接 secton的用法
__attribute__ ((section (name)))
比较常用的用法:
比如weak属性
#define __weak __attribute__((weak))
可以定义一个宏包含自定义
#define SECTION(name) __attribute__ ((section(#name)))
比如自定义如下字段
#define CMD_REGISTER SECTION(.cmd_register)
2.weak属性
若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak属性,则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号。当有函数或变量名可能被用户覆盖时,该函数或变量名可以声明为一个弱符号。
weak属性在linux里面使用很广泛,一般平台提供默认函数时使用,后面开发者可以重新写该方法,可以达到覆盖的目的。
3.#
#用来把参数转换成字符串
#define SQUARE(x) printf("The square of "#x" is %d.\n", ((x)*(x)));
SQUARE(8)输出:
The square of 8 is 64
4.##
##运算符可以用于宏函数的替换部分,可以把两个字符串或者字符组合起来
例如
#define GPIO(port,pin) GPIO##port_##pin
例如对于GPIO(A,2) 展开即GPIOA_2
5.__VA_ARGS__
这个时C99的规范才添加的。如果支持C99, 则需要指定编译规范为C99,否则不支持
他主要表示是一个可变参数的宏
例如:
#define DEBUG(fmt, ...) printf(fmt, __VA_ARGS__)
#define DEBUG(fmt, ...) printf(fmt, ##__VA_ARGS__)
注意__VA_ARGS__前面加##比较特殊,##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错。
例如:
例如上面DEBUG("aaaa\r\n"); 如果不加##,会报错
此外,这个宏只能用在宏定义里面,在函数里面会报错。
6.可变参数常用用法
static char usrBuf[512];
void my_printf(char *fmt, ...)
{
va_list vArgs_list;
va_start(vArgs_list, fmt);
vsnprintf(usrBuf, 512, fmt, vArgs_list);
va_end(vArgs_list);
...
}
当然需要头文件
#include <stdarg.h>
#include <stdio.h>
7.union用法
union使用得比较少,注意初始值永远都是第一个。
例如
typedef union _DWORD_
{
u32 dwordAll;
u16 word[2];
u8 byte[4];
}UNDWORD;
比如定义一个UNDWORD A = 0xAAAAAAAA