/*
前导符号 \033[xxm --> xx 为代号, 对个代号组合中间用 ; 分隔。
0=复位
1=高亮开 21=高亮关
2=低亮开 22=低亮关
3=粗体开 23=粗体关
4=下划线开 24=下划线关
5=斜体开 25=斜体关
6=闪烁开 26=闪烁关
7=反白开 27=反白关
8=隐形开 28=隐形关
9=划除开 29=划除关
前景色:30(黑) 31(红) 32(绿) 33(黄) 34(蓝) 35(紫) 36(青) 37(白)
背景色:40(黑) 41(红) 42(绿) 43(黄) 44(蓝) 45(紫) 46(青) 37(白)
*/
#define nd_debug(fmt,...) debug_common("\033[40;32m-->", "\033[0m", fmt, ##__VA_ARGS__)
#define nd_info(fmt,...) debug_common("\033[40;34m-->", "\033[0m", fmt, ##__VA_ARGS__)
#define nd_warn(fmt,...) debug_common("\033[40;33m-->", "\033[0m", fmt, ##__VA_ARGS__)
#define nd_error(fmt,...) debug_common("\033[42;31m-->", "\033[0m", fmt, ##__VA_ARGS__)
#define nd_fatal(fmt,...) debug_common("\033[37;31m-->", "\033[0m", fmt, ##__VA_ARGS__)
void debug_common(const char *color_start, const char *color_end, const char *fmt, ...)
{
va_list ap;
char line[8096]={0};
va_start(ap, fmt);
vsprintf(line, fmt , ap);
va_end(ap);
if (color_start && color_end) {
cout << color_start << line << color_end << endl;
}
else {
cout << line << endl;
}
}
#define LOC_NODE_COMMON(N,P) cdev->node_##N = cdev->node_##P.child(#N)
LOC_NODE_COMMON(dev_type,physicalReader); ##为当做字符串连接起来。 #当做字符串占位。
//cdev->node_dev_type = node_physicalReader.child("dev_type");
看看下面的代码就知道了:
1. #define debugf(fmt, args...) \
do { printf("%s %s %s():", __FILE__, __LINE__ , __FUNCTION__); printf(fmt, ##args); } while (0);
2. #define CONCAT(a,b,c,d) a ## b ## c ## d
把abcd连接成字符串,其中abcd不能是宏, 如果使用宏,应当按照上一篇文章那样使用再次转换才可以
其
实我觉的u-boot最好的东西是在整个架构搭建上作的相当出色, 不过仅仅有些宏之间的配合上存在误差现象以及在内存的配置管理上过于死板,
例如NAND类的宏定义需要每级子项都要定义,这需要对uboot对于此类的宏都要知道而且要明白每个宏所能控制的范围以及各个配合起来的控制范围。
显存改变/环境变量双备份这些宏改变还要记得修改堆栈宏定义,确认除去必要的运行时空间还要有格外的改变增加的空间。 呵呵 都是经验记录一下备忘
要把非字符串的宏在程序中要按照字符串的形式使用的方法:
代码一:
#define TAGS 1234567
#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)
int main()
{
printf("Hello " XMK_STR(TAGS));
return 0;
}
result:
Hello TAGS , 不是我们想要的, 但是可以看出宏的名字被打印出来了
代码二:
#define TAGS 1234567
#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)
int main()
{
printf("Hello " MK_STR(TAGS));
return 0;
}
result:
Hello 124567 , 是我们想要的, 哈哈, 其中的原理很有意思,仔细体会一下, C里边这种东西比较少用到
还有一个比较常用的跟踪
#define TRACE(ARG) cout << #ARG << endl; ARG
int main() {
TRACE(for do it);
return 0;
}
阅读(1866) | 评论(0) | 转发(0) |