宏、枚举、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

宏和枚举及typedef        宏和枚举及typedef三者有相似的功能,但又有各自独特的用途和特点,以下主要介绍三者的用法和注意事项。 1.      枚举 a.枚举的目的值...

黑马程序员———C语言———【枚举、typedef、宏、static和extern、文件操作】

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- ———————————————————————————————————————————————...

枚举、宏、typedef

一、枚举类型的定义 1、基本数据类型       >指针       >空类型 void       >构造类型:数组、结构体、共用...

C数据类型和组合类型(结构、联合、枚举和typedef)

注:《C primer plus》笔记 一、基本类型:     有符号整数     int:系统的基本整数类型。C保证int类型至少有16位长(2字节),具体长度视系统和硬件而定。(位是二进制位...

【C语言连载六】--------变量、修饰词、结构体、枚举、typedef

======变量 修饰词==================== 一、变量 & 作用域      (1)局部变量:----> { }内            ---->  不赋...

使用【枚举型】typedef enum

为什么使用typedef enum   在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON  1...

extern 关键字的使用,const引用, typedef名字, 枚举

1.extern 关键字的使用1.1.将一个非const变量定义在一个文件中,假设已经做好了合适的声明,就可以在另外的文件中使用这个变量//file_1.cc int counter; //fil...

黑马程序员--c语言:结构体、枚举、预处理指令、typedef、static与extern、递归思想

一、结构体 1.定义结构体  struct Person { // 里面的3个变量,可以称为是结构体的成员或者属性         int age; //...

嵌入式开发第9天(结构体,枚举,共同体,typedef)

复合数据类型 自定义类型,由基本的类型构成 结构体 结构体类型定义 struct 名字{ 基本的类型; }; 结构体的大小是怎么算出来的? struct student_info { c...

C++引用/枚举/typedef/头文件/预编译器/自定义头文件

//引用是别名 //int &refVal2;//引用类型定义必须初始化 //int &refVal3 = 10;//引用初始化必须是对象 //当初始化后,只要改引用存在,他就保持绑定到初始化时...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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