您的位置:首页 > 其它

define \enum \const 定义一个常量

2017-10-19 18:31 127 查看
C语言从源代码到可执行文件的过程:

预编译->编译->汇编->链接

#define MAX 10
在预编译的时候就对代码中的MAX进行替换,本身不开辟空间,MAX无类型
const int max = 10;
在编译的时候对代码进行替换,开辟一个sizeof(int)大小的空间,max的类型是const int
enum{Max=10};
在编译的时候对代码进行替换,不开辟空间,Max的值只能是整型


#define MAX 10


编译器在处理这个代码之前会对MAX进行处理,替换为10,或许有些人认为这样的定义看起来和const常量很相似,但是他们还是有区别的,#define的定义其实就是简单的文本的替换,并不是作为一个量来使用。

#define MAX 10
int a[MAX];/*这样会成为int a[10],在预编译的时候MAX直接被替换为10*/

*扩展*
#define max(a,b) (( a > b ) ? a : b )

int main()
{
max(10,5);/*等价于(( a > b ) ? a : b );*/
return 0;
}
前面说过#define的定义其实就是简单的文本的替换,并不是作为一个量来使用。

所以他的使用就好比是做一此替换

define 的多行定义

#define可以进行多行定义要在每一行的末尾要加上\,,虽然看起来有点多余,但是确实是一个灰常经典而且在设备驱动代码中经常要用到的一个方法,格式如下:

#define test(arg1,arg2) do { \
express1; \
express2; \
}while(0)


const int max = 10;


const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
首先,我们先把const这个单词忽略不看,那么max是一个int类型的自动变量,
我们给它赋予初始值10。
然后再看const.
const作为一个类型限定词,和int有相同的地位。
const int a;
int const a;
的作用是等价的。所以对于使用const我们要明白在一个语句中他所描述的对象,在这里const修饰的对象是a,和int没有关系。const 要求他所修饰的对象为常量,不可被改变,不可被赋值,不可作为左值(l-value)。所以变量a的值就是一个常量,不可被更改,如果程序在后面企图对a修改就会出错。

const int a;
a=0;这是一个很常见的错误使用。

const double pi=3.14;这是一个很常见的使用方式,
在程序的后面如果企图对pi再次赋值或者修改就会出错。

const int* p;
还是先去掉const 修饰符号。
注意,下面两个是等价的。
int* p;
int *p;
其实我们想要说的是,*p(解引用)是int类型,p是int的指针。

const int* p;
其实等价于
const int (*p);
int const (*p);
即,*p是常量。*p对应的int类型,也就是说,p指向的空间中(这个空间是 int* 类型)数据是常量。
于是
p+=8; /*合法(p的地址是可以被改变的,但即使是改变,改变后的地址中的数据也必须是常量)*/
*p=3; /*非法,p指向的空间中的数据是常量。*/

那么如何声明一个自身是常量指针呢?方法是让const尽可能的靠近p(让const修饰的对象是p);
int* const p;
const右面只有p,显然,它修饰的是p,说明p不可被更改。然后把const去掉,可以
看出p是一个指向 int形式变量的指针。
于是
p+=8; //非法,p是常量,即p指针的指向不能被改变
*p=3; //合法

const int* const p;
说明p自己是常量,且p指向的变量也是常量。
于是
p+=8; //非法
*p=3; //非法


enum{Max = 10};


枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举元素进行赋值(赋值和初始化不同)。
枚举元素作为常量,它们是有值的,C 语言在编译时按定义的顺序使它们的值为++1…。
枚举值可以用来作判断。
一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: