一,const关键词有什么作用。
1,定义const常量。
例如: const int n = 10;
2,修饰函数的形参。
该作用很重要,在函数的形参必要的地方加const修饰可以
增加函数的健壮性,防止意外的修改。
例如:- 97 char *strcpy(char *dest, const char *src)
- 98 {
- 99 +---char *tmp = dest;
- 100
- 101 +---while ((*dest++ = *src++) != '\0')
- 102 +---+---/* nothing */;
- 103 +---return tmp;
- 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函数和宏函数差不多,但比宏函数安全。例如:- 24 static inline void INIT_LIST_HEAD(struct list_head *list)
- 25 {
- 26 +---list->next = list;
- 27 +---list->prev = list;
- 28 }
- 37 static inline void __list_add(struct list_head *new,
- 38 +---+---+--- struct list_head *prev,
- 39 +---+---+--- struct list_head *next)
- 40 {
- 41 +---next->prev = new;
- 42 +---new->next = next;
- 43 +---new->prev = prev;
- 44 +---prev->next = new;
- 45 }
都是一些短小的函数声明为内敛函数。--------------------------------------------------------------------------------------
阅读(345) | 评论(0) | 转发(0) |