关闭

宏、枚举、typedef

75人阅读 评论(0) 收藏 举报

预处理也称为预编译,为编译做预备工作,主要进行代码文本的替换工作,用于处理#开头的指令,其中预处理器产生编译器的输出。同一个处理阶段所进行的工作只是纯粹地替换与展开,没有任何计算功能。


C/C++头文件的ifndef/define/endif的作用:如果一个项目中存在两个C文件,而这两个C文件都include了同一个头文件,当编译时,这两个C文件要一同编译成一个可运行文件,可能会产生大量的声明冲突。而解决的办法是把头文件的内容都包含在#ifndef 和 #endif 中。


#Include<filename.h>,编译器先从标准库路径开始搜索filename.h,使得系统文件调用较快。而对于#include'filename.h' 编译器先从用户的工作路径开始搜索filename.h,然后寻找系统路径,自定义文件较快。


1)宏定义主要是在预处理命令,不是语句,在进行宏定义时,不能以分号结束。主要做的是在编译钱做字符替换工作,需要对代码进行展开,相对函数调用的方式,会存在较多的冗余代码。由于还没编译,所以无法进行类型检查。只有在编译的时候才能检查类型是否匹配。

2)由于优先级的不同,使用宏定义时,可能会存在副作用,所以要需要注意括号的使用。

3) 无法单步调试。

4)使用宏无法操作类的私有数据成员。

5)考虑到可能存在数据溢出的问题,更加规范的写法是使用长整型,即UL类型。


含参数的宏与函数的的区别:

1)函数中的实参和形参都要定义类型,两者的类型要求一致,如果不一致,会进行类型转换。宏不存在类型问题,宏名无类型,它的参数也无类型。

2)函数调用时,实现求出实参表达式的值,然后带入。带参的宏只是进行简单的字符替换。

3)宏替换不占用运行时间,而函数调用则占用运行时间。

4)函数调用是在程序时处理的,需要分配临时的内存单元,宏展开是在编译时运行的,在展开时不分配内存单元,也不进行值得传递,也没有返回值的概念。

5)宏展开后源程序会变得很长,因为每展开一次使程序内容增长,而函数调用不使源程序变长。


宏来代表简单的表达式比较合适。


枚举和define的不同:

1) 枚举常量是实体中的一种,而宏定义不是实体。

2)枚举可以一次定义多个常量,宏只能定义一个。

3)枚举常量属于常量,有类型。宏定义不是常量,没有类型。

4)#define宏常量在预编译阶段进行文本的替换工作,枚举常量在编译的时候确定其值。

5)一般在编译器里,可以调试枚举常量,但是不能调试宏常量。


typedef 和 define的区别:

typedef 和 define 都是替对象取一个别名,以此来增强程序的可读性。



1)原理不同。

#define是C语言中定义的语法,它是预处理命令,在预处理时进行简单而机械的字符串替换,不做类型检查。typedef是关键字,在编译时处理,有类型检查的功能。在自己的作用域内给一个已经存在的类型取一个别名,但是不能在函数定义里面使用标识符typedef。用typedef 定义数组、指针、结构等类型将带来很大的方便,可以增强程序的可读性。

2)功能不同。typedef用来定义类型的别名,这些类型不仅可以包含内部类型,还包括自定义类型,可以使类型易于记忆。#define 不只是可以为类型取一个别名,还可以定义常量、变量、编译开关等。

3)作用域的不同。#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用,而typedef 有自己的作用域。

4)对指针的操作不同。
















0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5656次
    • 积分:480
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:26篇
    • 译文:0篇
    • 评论:0条
    文章存档