记录工作遇到的简单的代码规范
宏
宏定义
宏定义可以帮助我们防止出错,提高代码的可移植性和可读性
只是简单的字符串替换,在预编译的过程中进行替换。
宏的使用
- 示例一:变量和表达式都必须用括号括起来
1
#define MAX( a, b) ( (a) > (b) (a) : (b) )
- 示例二:使用宏传参数类型
1
2#define MALLOC(n, type) \
((type *)malloc((n)* sizeof(type)))
宏函数
宏函数常用的定义方式
1 | #define MACRO(arg1, arg2) do { \ |
获取变量的指定位长度数据
在想要获取一个变量的后几位数据的时候可以使用按位与的方式得到
如:获取一个int变量后八位数据
1 | int value; |
调试
打印输出调试信息
打印时使用编译器自带的宏,来定位bug位置
- FILE :宏在预编译时会替换成当前的源文件名
- LINE:宏在预编译时会替换成当前的行号
- FUNCTION:宏在预编译时会替换成当前的函数名称
- VA_ARGS:总体来说就是将左边宏中 … 的内容原样抄写在右边 VA_ARGS 所在的位置。它是一个可变参数的宏,是新的C99规范中新增的,目前似乎只有gcc支持(VC从VC2005开始支持)。要注意的是,printf 的输出格式是括号内左边是字符串,右边是变量,而且右变量与左输出格式是一一对应的。所以在上面那个例子中, VA_ARGS只能是一些不含任何变量的字符串常量。因为上面的例子中若VA_ARGS含有变量,整个printf的输出与变量便不能一一对应,输出会出错。
如果仅仅是替换函数名,可用如下方式,此时对VA_ARGS无任何特殊要求:#define myprintf(…) printk(VA_ARGS),在调试程序时可以这样用:1
2
3
4
5#ifndef LOG_NDEBUG_FUNCTION
#define LOGFUNC(...) ((void)0)
#else
#define LOGFUNC(...) (printk(__VA_ARGS__))
#endif
使用
-
示例一:
1
printk("%s%d\n", __FILE__, __LINE__);
-
示例二:
1
2#define myprintf(...) printk("[lch]:File:%s, Line:%d, Function:%s," \
__VA_ARGS__, __FILE__, __LINE__ ,__FUNCTION__);
测试
1 | #include <stdio.h> |
输出结果:
wqshao@wqshao:~$ ./a.out
[lch]:File:test.c, Line:8, Function:main,swq
hello word!!