宏定义,const变量,枚举的区别

来源:互联网 发布:js正则表达式函数 编辑:程序博客网 时间:2024/05/17 02:30

宏定义(#define):
    宏定义实际上是一种替换技术,是一种自我欺骗的手法,其目的是提高程序的可读性和简洁性。宏定义是给编译器准备的,编译完成后其中的宏就已经被实际内容所取代。
    因此,通过#define“定义”出的所谓常量对程序来说并不是真正的常量,只是在我们眼里看似常量而已。当程序执行后,我们并不能知道其中的某个常数到底是通过宏定义“定义”的还是直接给出的。通过宏定义“定义”的所谓“常量”没有任何类型检查。
 
 
常量定义(const):
    从名称上看,const才是定义常量的最正典的途径,事实也的确如此。const定义出的常量才是真正的常量,也是真正的“变量”,它会在程序执行时被分配空间,而且也有类型,因此在编译时也就会被进行类型检查。在C中,const常量跟变量的唯一区别是该处空间的内容一经初始化即不能被修改。
    使用const常量时,需要注意的一个地方是:我们一样可以修改一个const指针所指向的内容。
    const的用法在C++中被赋予了更丰富的含意,其中最常见的就是const引用,形如:const CSomeClass &,常被用于函数参数类型的指定。另外C++中还有const成员等。
 
 
枚举(enum):
    枚举是在后来才引入C中的,主要用来定义一个常量集合,并将相关的枚举变量的取值范围限定于其中,其目的也是为了丰富程序的语意,提高程序的可读易懂姓。
    枚举常量值完全可以被当作一个整型值来看待,因此可以赋予一个整型变量,但是它不能被赋值,因为它不是一个变量。
    通过枚举方式定义的常量通常是作为一个集合出现的,该集合中的每个常量的含义有相关性。就比如我们最常见的关于星期的枚举类型
enum Day {Sunday,Monday,tuesday,Wednesday,Thursday,Friday,Saturday};
 
另外:常量通常都写成大写形式,这是一个不成文的约定。


1.宏定义是在预处理阶段进行展开;cnost变量是在编译运行阶段使用

2.宏定义没有类型,不做任何类型检查,仅仅是进行展开;const修饰的变量具有具体的类型,编译阶段执行检查

3.宏定义在文件中有多少次就展开多少次,不会分配内存空间;const修饰的变量会在内存中分配空间

4.const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝

5.有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。



有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。



有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。


1.枚举属于常量;但宏定义不是常量

2.枚举常量是实体的一种;但宏定义不是实体

3.枚举具有类型,但宏定义没有类型,枚举与普通变量有作用域和值,但宏定义没有,它是一种预处理替换