Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14383
  • 博文数量: 17
  • 博客积分: 660
  • 博客等级: 上士
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-18 17:32
文章分类

全部博文(17)

文章存档

2011年(1)

2010年(15)

2009年(1)

我的朋友
最近访客

分类: C/C++

2010-07-01 12:47:04

1.1
#ifdef NDEBUG
#define TRACE(S) S
#else
#define TRACE(S) printf(”%s;\n”, #S); S
#endif

问:以上TRACE()宏的作用是什么?

1.1 这道题主要考察#的功能,S是一个表达式。TRACE()的作用就是在DEBUG状态下,计算表达式S的值之前先打印S。
 “#”把宏参数变成一个字符串,“##”把两个宏参数粘合在一起。
#define CONS(a, b)  int(a##e##b)          /*int(2e3)==2000*/
需要注意的是:当用宏作为另一个宏的参数时,凡宏定义里面有"#"和"##"的地方是不会再展开的。
#define NUM  (24)
#define STR(s)  #s
printf("%s", STR(NUM));                   /*就是printf("%s", "NUM");*/

要解决参数宏不展开的问题,可以添加一层中间转换层。加这层宏的用意是把所有的参数在这层里全面展开,那么在转换宏的那一个宏(_STR)就能得到正确的宏参数。换句话说,过程应该是,先替换掉所有的非含"#"("##")宏,最后实现"#"("##"),就不会出现含带"#"("##")宏参数的情况了。
#define NUM  (24)
#define _STR(s)  #s
#define STR(s)  _STR(s)
printf("%s", STR(NUM));                   /*就是printf("%s", "24");*/
                                          /*STR(NUM)-->_STR(24)-->"24"*/



1.2 #error的作用?

1.2 #error用于向编译器报错,并输出它后面带的错误信息。例如:
#ifndef SOMETHING
#error SOMETHING not defined!
#endif
如果在这段代码之前未定义过SOMETHING,则在编译时出错,并给出”SOMETHING not defined!”的错误信息。
 
1.3 定义一个宏,求出给定数组中的元素的个数
#define NELEMENTS(array) ??

1.4 定义一个宏,求出给定结构中给定成员的偏移量
#define OFFSET(structure, member) ??

1.3 #define NELEMENTS(array) (sizeof(array) / sizeof((array)[0]))

1.4 #define OFFSET(structure, member) ((int) &(((structure *)0)->member))

请说出static关键字的3种用处:

1)用于全局变量;

2)用于局部变量;

3)用于函数。

/* file.c */

static int a;

int b;

static int fn()

{

static int x;

int y;

}

 

7 const关键字】

7.1 const关键字的意义是什么?

7.2 解释以下的变量定义:

const int a1;

int const a2;

const int *a3;

int * const a4;

int const * const a5;

8 volatile关键字】

8.1 volatile意义?例如

volatile int *p;

8.2 volatile能和const一起使用吗?例如

volatile const int *p;

阅读(285) | 评论(0) | 转发(0) |
0

上一篇:调试手段

下一篇:使用gdb调试程序

给主人留下些什么吧!~~