宏、枚举、typedef

原创 2016年08月30日 18:22:34

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


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)对指针的操作不同。
















枚举、typedef关键字

1)枚举类型介绍及定义 目前为止接触到的数据类型: 基本数据类型 指针类型 空类型 void 构造类型 数组、结构体 枚举类型 a、枚举类型 ①枚举类型定义的一般形式: enum 枚举类型名{ 值1,...
  • ITclody
  • ITclody
  • 2015年06月29日 01:11
  • 1801

宏定义与typedef不能说的秘密

研究问题 宏定义#define与定义别名typedef使用方法 define与typedef区别 要点: 宏定义#define为预处理指令在编译处理时进行简单的替换,不作正确性检查,不关含义是否正确照...
  • qq_31360933
  • qq_31360933
  • 2017年01月06日 21:57
  • 822

C++枚举类型和typedef声明新的类型名

如果一个变量只能有几种可能的值,可以定义为枚举类型。所谓枚举类型就是把变量的值一一列举出来,变量的值只能在列举出来的值的范围内。enum weekday{sun,mon,tue,wed,thu,fri...
  • qq_28234213
  • qq_28234213
  • 2017年06月12日 21:21
  • 207

枚举与宏的区别

枚举: 枚举是一种变量类型,枚举基本等效于int类型,占用同样的空间,同样的数值范围,但是枚举通常都是表示常数变量,对枚举变量做一些算术计算通常是编译器不允许的,但是可以加上强制类型转换,本来不在枚...
  • hellomxj1
  • hellomxj1
  • 2014年01月21日 15:26
  • 1965

宏定义和枚举类型的区别

摘要:在C语言的编程中,我们常常需要定义一些常量,此时是采用宏定义还是采用枚举类型呢?它们有哪些区别?本文主要探讨这个问题。 一、作用域对比 1.1宏定义的默认作用...
  • autowanglei
  • autowanglei
  • 2014年11月07日 13:47
  • 1232

宏和枚举及typedef

宏和枚举及typedef        宏和枚举及typedef三者有相似的功能,但又有各自独特的用途和特点,以下主要介绍三者的用法和注意事项。 1.      枚举 a.枚举的目的值提高程序的...
  • czs19910328
  • czs19910328
  • 2014年01月21日 17:37
  • 320

枚举、宏、typedef

一、枚举类型的定义 1、基本数据类型       >指针       >空类型 void       >构造类型:数组、结构体、共用体       在实际问题中,有些变量的取值被限定在一个有限的范...
  • zjqx_w
  • zjqx_w
  • 2015年07月22日 19:50
  • 318

C++ 宏定义和 typedef 的区别

宏定义#define为预处理指令,在编译处理时进行简单的文本替换,不作正确性检查,不关含义是否正确照样带入,只在编译已被展开的源程序时才会发现可能的错误并报错。   typedef为复杂的声明定义...
  • misayaaaaa
  • misayaaaaa
  • 2017年04月06日 09:25
  • 620

iOS 中的宏定义,常量,与枚举类型使用

开发过程中的经常需要使用一些全局的常量,便于方法之间的参数传递和类型确定等,经常使用到的有宏定义,const常量以及枚举等,我们经常使用宏定义来进行全局常量的定义,但是是不是所有的全局常量宏定义都是最...
  • WangErice
  • WangErice
  • 2016年05月30日 14:52
  • 1366

#define与enum,你不知道的那些事

什么时候需要用到enum呢,就是变量的数值在几个范围之间.red,blue,black.这样用enum比较好.当然也可以用define.但是define维护起来比较麻烦. #define 适合比较少...
  • hbuxiaofei
  • hbuxiaofei
  • 2014年03月25日 11:33
  • 8287
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:宏、枚举、typedef
举报原因:
原因补充:

(最多只允许输入30个字)