预处理相关问题

预处理

含参数宏与函数的区别

1)函数调用时,首先求出实参表达式的值,然后带入形参。而使用带参的宏只有是进行简单的字符替换。

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

3)对函数中的实参和形参都要定义类型,两者的类型要求一致,如果不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。宏定义时,字符串可以是任何类型的数据。

4)调用函数只可得到一个返回值,而宏可以设法得到几个结果。

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

6)宏替换不占用运行时间,而函数调用则占用运行时间(分配单元、保留现场、值传递、返回)。

7)参数每次用于宏定义时,它们都将重新求值,由于多次求值,具有副作用的参数可能会产生不可预料的结果。而参数在函数被调用前只求值一次,在函数中多次使用参数并不会导致多种求值过程,参数的副作用并不会造成任何特殊的问题。

 

枚举和define的区别

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

2)枚举常量属于常量,但宏定义不是常量。

3)枚举常量具有类型,但宏没有类型,枚举变量具有普通变量相同的性质,如作用域值等,但宏没有。

4)#define宏常量是在预编译阶段进行简单的替换,枚举常量则是在编译的时候确定其值。

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

6)枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。

 

typedef和define的区别

1)原理不同。#define是C语言中定义的语法,它是预处理指令,在预处理时进行简单而机械的字符串替换,不做正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。typedef是关键字,它在编译时处理,所以typedef有类型检查的功能。它在自己的作用域内给一个已经存在的类型一个别名,但是不能在一个函数定义里面使用标识符的typedef.

2)功能不同。typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。typedef还有一个重要的用途,那就是定义与机器无关的类型。#define不只是可以为类型名取别名,还可以定义常量、变量、编译开关等。

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

4)对指针的操作不同。两者在修饰指针类型时,作用不同。

 

C++中宏定义和内联函数的区别

1)宏定义是在预处理阶段进行代码替换,而内联函数是在编译阶段插入代码的;

2)宏定义没有类型检查,而内联函数有类型检查。

 

#define和const定义常量的区别

1)define只是用来进行单纯的文本替换,define常量的生命周期止于编译期,不分配内存空间,它存在于程序的代码段,在实际程序中它只是一个常数,一个命令中的参数并没有实际的存在;而const常量存在于数据的数据段,并在堆栈中分配了空间,const常量在程序中确确实实地存在,并且可以被调用、传递。

2)const常量有数据类型,而define常量没有数据类型。编译器对const常量进行类型安全检查,如类型、语句结构等,而define不行。

3)很多IDE支持调试const定义的常量,而不支持define定义的常量。由于const修饰的变量可以排除程序之间的不安全性因素,保护程序中的常量不被修改,而且对于数据类型也会进行相应的检查,极大地提高了程序的健壮性,所以一般更加倾向于用const来定义常量类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值