Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7814
  • 博文数量: 5
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 17
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-12 17:30
文章分类
文章存档

2015年(2)

2014年(1)

2013年(1)

2012年(1)

我的朋友

分类: LINUX

2013-04-28 14:04:05

原文地址:const 作者:zhe_wang

一,const关键词有什么作用。
1,定义const常量。
       例如: const int n = 10;
2,修饰函数的形参。
        该作用很重要,在函数的形参必要的地方加const修饰可以
增加函数的健壮性,防止意外的修改。
例如:

  1.  97 char *strcpy(char *dest, const char *src)
  2.  98 {
  3.  99 +---char *tmp = dest;
  4. 100
  5. 101 +---while ((*dest++ = *src++) != '\0')
  6. 102 +---+---/* nothing */;
  7. 103 +---return tmp;
  8. 104 }
字符串拷贝函数源就是一个只读的形参,所以要加上const加以修饰。

const注意点:
    const声明常量时,有一种情况是声明指针,这时候const放在不同
的位置,表示的含义不一样。例如:
const int  *p;
int const *p; //这两种情况是一样的,p所指向的值是常量。
int * const p;//这种情况是指针是常量,而p指向的值是变量。
const int * const p;//这种情况指针p是常量,p所指向的值也是常量。

-------------------------------------------------------------------------------------
二,宏常量。
      C语言中不仅有const常量,还有宏常量,那它们之间有什么区别呢?
 const定义常量是有数据类型的,而#define宏定义常量却没有。
这样const定义的常量编译器可以对其进行数据静态类型安全检查,而
#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,
例如下:

#define N 100
#define M 200 + N
当程序中使用 M*N 时,原本想要 100 * (200+ N )的却变成了
100 * 200 + N。所以宏存在不安全性。

----------------------------------------------------------------------------------------
三,宏函数。
     C语言中的宏还可以带参数,带参宏又称为宏函数。带参宏也有一些安全隐患,
在linux内核中常用do{}while(0) 来解决这个安全隐患。
    
    为什么很多时候都喜欢使用宏函数呢?宏函数有个优点就是效率高,一般的函数
都要压栈出栈的,而宏函数都是替换,替换也是有代价的,那就是消耗内存,所以
为了一种平衡,在实际程序开发中,一些很短的函数基本上都是用宏函数实现的,
这样就可以节省一些时间,而又不用消耗太多的空间。

   宏函数有一些安全隐患,所以又提出了用inline声明的内敛函数,使用inline声明
的函数和宏函数差不多,都是声明一些短小的函数,inline声明的内敛函数在编译的
阶段就进行了展开,所以inline函数和宏函数差不多,但比宏函数安全。


例如:
  1.  24 static inline void INIT_LIST_HEAD(struct list_head *list)
  2.  25 {
  3.  26 +---list->next = list;
  4.  27 +---list->prev = list;
  5.  28 }
  1.  37 static inline void __list_add(struct list_head *new,
  2.  38 +---+---+--- struct list_head *prev,
  3.  39 +---+---+--- struct list_head *next)
  4.  40 {
  5.  41 +---next->prev = new;
  6.  42 +---new->next = next;
  7.  43 +---new->prev = prev;
  8.  44 +---prev->next = new;
  9.  45 }
都是一些短小的函数声明为内敛函数。
--------------------------------------------------------------------------------------

    



阅读(317) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~