标签:
第十章:
1. 可变参数的宏在 C99 规范中新增了可变参数的宏〈并不是所有的 CIC++编译器都支持可变参数宏 ,不过较
高版本的 GCC 支持这-规范〉。可变参数宏与固定参数宏的不同之处就是可变参数宏需要通过 _VA_ARGS_宏获取可变参数宏的可变参数。定义可变参数宏与定义可变参数函数的方法相同,都 使用3个点(...〉来表示可变参数,可变参数必须是宏和函数最后的参数。例如, 下面的代码定义
了 一 个可变参数宏。# c;:lefine pr_debug (x, .) printk (x, ,...vA一ARGS,J .,:使用下面的代码可以调用‘pr~debμg.宏。 ρ
pr_debug(”hello .\s”,”w。rld”~; . 不过使用下面的代码却会产生编译错误。
pr-‘-debug("hello world");
. .,
if {m == 1) test(20);
else
土丽的代码会被编译器替换成如下形式。
if(m == 1){n*=2; n+= l; J; // 这里不能有分号
elsetest<50) :
test(SO);
-- - ‘ . . ~
-产生编译错误的原因是_:_.vA_ARGS_宏不支持可变参数个数为0的情况. C99规范并没定义其
他的宏来解决这个问题,但 GCC对此进行了扩展,在-‘YA,;_ARG旦前加两个井号〈的即可。例如,
pr_debug宏可以改成如下的形式.# define.pr_debug(x; :> printk(x, tt_VA_ARGS_)
当可变参数个数为 0 时,这里的桦起到把前面多余的“,”去掉, 实际上变成了 printk(msg), 这样编译就能通过了。 .. ‘ ... 一’-
2. do{...}while(O)· 一 在阅i主CI.C十+代码时,会发现有很多宏在定义时使用了-do{...}while(O)结构J根据语义规则; 一--一
这个循环体只会执行一次就会退出,那么为什么要使用这样的结构呢? 如果用一句话解释原因,那么应该是“将多条语句作为 一个整体处理飞如果读者还不能理解。
那么就看看下面的例子。假设不使用 do{..:}while(的结构来定义如下的宏也
#define test(n) n*;2; n+a 1如果将test宏用手下面的代码,“intn =0;”和“n+="‘l;”将会被分开。
if (m == 1) test(20);
上面的代码的编译时会被替换如下形式, n+=J己被排除在if语旬之外。
if(m==l)
n食=2;
n+=l;
. 那么为什么不能采用{...}的形式呢?例如, test 宏改成如下的形式, #define test{nl {n·‘"‘2; n+= l;}
test宏使用{...}形式的确不存在上述的问题,但大多数 CIC忡程序员都会有一个习惯,就是在 每条语句后面加上一个分号(;)。
if {m == 1) test(20);
else
土丽的代码会被编译器替换成如下形式。
if(m == 1){n*=2; n+= l; J; // 这里不能有分号
elsetest<50) :
上面的代码是无法被 CIC-++编译器编译通过的。为了解决这个问题,应该采用 do{...}whi闸的
结构,代码如下:
#-define test (n) d。{n*=2; n+· l; )while (.0)使用 d-0{...}whi峭的结构定义的 test宏对于上面的 if.·.else 结构的代码会翻译成如下形式。这
样就可以适应不同的情况丁。所以当定义的宏涉及多条语句时应采用 do{...}while(O)结构。 if(m ··l)
n+= l; )while(O);
else
test(SO);
gdb可以跟踪调试用户空间的程序。在本节会使用 gdb熟悉一下基本的调试命令。尽管一般不会直接 使用 gdb 命令在孚机、开发板或棋拟吉普上调试程序,但这些调试命令仍然可以用于 gdbserver远程调试。
list命令有如下 3种调用格式,
list:显示上一次调用 list命令输出的最后一行后面的 10行。第一次调用 list命令会显示程 序开头的 10行。
list-:显示上一次调用 list命令输出的第一行前面的 IO行。第一次调用 list命令什么都不 会显示。
? list t 显示第 n行附近的 IO行, 一般会显示第 n行前面 5行和l后面 4行,加上第 n行, 正好是 10行。 如果前面或后面的行数不足,则只显示实际的行。
标签:
原文地址:http://www.cnblogs.com/nhdmmdxq/p/5653163.html