c语言和gcc常用

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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值