一,const关键词有什么作用。
1,定义const常量。
例如: const int n = 10;
2,修饰函数的形参。
该作用很重要,在函数的形参必要的地方加const修饰可以
增加函数的健壮性,防止意外的修改。
例如:
字符串拷贝函数源就是一个只读的形参,所以要加上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宏定义的常量却只是进行简单的字符替换,没有类型安全检查,
例如下:
三,宏函数。
C语言中的宏还可以带参数,带参宏又称为宏函数。带参宏也有一些安全隐患,
在linux内核中常用do{}while(0) 来解决这个安全隐患。
为什么很多时候都喜欢使用宏函数呢?宏函数有个优点就是效率高,一般的函数
都要压栈出栈的,而宏函数都是替换,替换也是有代价的,那就是消耗内存,所以
为了一种平衡,在实际程序开发中,一些很短的函数基本上都是用宏函数实现的,
这样就可以节省一些时间,而又不用消耗太多的空间。
宏函数有一些安全隐患,所以又提出了用inline声明的内敛函数,使用inline声明
的函数和宏函数差不多,都是声明一些短小的函数,inline声明的内敛函数在编译的
阶段就进行了展开,所以inline函数和宏函数差不多,但比宏函数安全。
例如:
都是一些短小的函数声明为内敛函数。
--------------------------------------------------------------------------------------
1,定义const常量。
例如: const int n = 10;
2,修饰函数的形参。
该作用很重要,在函数的形参必要的地方加const修饰可以
增加函数的健壮性,防止意外的修改。
例如:
- char *strcpy(char*dest,const char *src)
- {
- +---char*tmp= dest;
-
- +---while((*dest++=*src++)!='\0')
- +---+---/*nothing*/;
- +---return tmp;
- }
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函数和宏函数差不多,但比宏函数安全。
例如:
- static inline void INIT_LIST_HEAD(struct list_head*list)
- {
- +---list->next= list;
- +---list->prev= list;
- }
- static inline void __list_add(struct list_head*new,
- +---+---+--- struct list_head *prev,
- +---+---+--- struct list_head *next)
- {
- +---next->prev= new;
- +---new->next=next;
- +---new->prev= prev;
- +---prev->next= new;
- }
--------------------------------------------------------------------------------------