码迷,mamicode.com
首页 > 其他好文 > 详细

第十章

时间:2016-07-08 14:59:43      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

第十章:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!