-
1、define在程序预处理期间确定,仅仅是简单的进行字符替换。
1)宏定义没有分号
2)宏参数超过两个时候存在副作用,特别当配合++,--自操作的时候
3) 宏定义的常量可以作为数组中[ ]的大小限制,而const则不行,因为数组大小必须在编译期间确定(c++中则不一样)
创建test.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define Max 10
4 int main()
5 {
6 const int Min = 8;
7 int array[Max] = {1,23,3};
8 printf("define Max = %d\n",Max);
9 printf("const Min = %d\n",Min);
10
11 return 0;
12 }
在虚拟机使用 arm-linux-gcc -E test.c -o test.i 仅仅预编译test.c,并输出test.i,查看预编译后结果,发现和分析的一样:
-
2、const修饰的只读变量在程序编译期间确定,具有特定的类型可以让编译器对其进行类型安全检查。
1)在定义const变量的同时应该对其进行初始化;
2)当const修饰函数形参是,表明函数体内部不能修改其值;
/*该函数使用const修饰形参,在处理数组时候将其视为常量,不可更改,保护数组数据
**该const仅保护数组的值,不保护string指针
**因为指针传给函数的只是一个副本,并不会修改指针的值
*/
size_t strlen( char const *string )
{
int length;
for( length = 0; *string++ != '\0'; )
length += 1;
return length;
}
3)const修饰指针常量和常量指针
/* val的值不能被更改,只能为345,作用域并没有因为const而改变 */
const int val = 345; 《==》int const val =345;
/* 修饰为常量指针,其值不能改变,即不能*point = val;指针可以改变,即能point = &val */
const int *point = 100;《==》 int const *point = 100;
/* 修饰为指针常量,其指针不能改变,即不能point = &val2;值可以改变,即能*point = val2 */
int * const point = &val;
/* 声明该指针变量里面的内容不可改变,同时该内容指向的内容亦不可改变。 */
const int *const point = 100;
-
3、inline修饰的内联函数在编译期间确定,具有类型安全检查。
1)在调用inline函数的地方不是跳转,而是把代码直接写进去,所以并不存在入栈,出栈等操作。
2)是一种牺牲空间换取执行效率的做法,所以内联函数应该尽量的精简短小,用在经常重复调用的地方。
3)inline应该与函数体定义放在一起,否则会不起作用,即使你编译通过
/* 正确做法 */
void print(void);
inline void print(void)
{
printf("hello,girls?");
}