C++基础:#define宏定义和inline,const,enum的区别

#defind 宏定义函数 和 inline 函数的区别:

宏看起来像函数,但不会招致函数调用带了的额外开销。


1.inline函数可运行调式,宏定义函数不能调试


2.inline函数进行参数类型安全检查,宏定义不可以


3.宏定义定义的函数可能发生错误,因为其是整体的替换,就算是带上括号也可能发生错误:
#define max(a,b)  f((a) > (b) ? (a++) :(b) )
a = 5, b = 1
a = 5, b = 10
max(a,b)  //a的值会因b值的大小而发生变化,错误


#define宏定义常量和cosnt,enum的区别:

#define 宏定义常量,在开始预处理时就要被替换,所以定义的记号名不会进入记号表,当编译调试时,因为到时直接是一个数值,可能让人产生迷惑。 可以用const 和 enum 来代替宏。常量肯定会进入记号表,可以更容易跟踪,使用常量可能比使用#define导致较小量的码,因为编译器会盲目的将宏定义进行替换,而常量一般在内存中只有一份实体

当用常量替换#define时有两种特殊情况


1.定义常量指针:常量定义一般放在头文件,因此要将指针声明为const,

const char *const authorname = "Scott Meyers";


2.class专属常量,为了将常量的作用域限制于class内,必须让它成为class的一个成员;为了确保此常量只有一份实体,必须让它成为一个static成员:


class GamePlayer{
private:
static const int NumTurns;      //常量声明式
int scores[NumTurns];            //使用该常量
};


const int GamePlayer::NumTurns = 5;


///或者可以如下:
class GamePlayer{
private:
enum{NumTurns = 5};
int scores[NumTurns];
}



我们无法利用#define创建一个class专属常量,因为#define并不重视作用域。

取一个const地址是合法的,但取一个enum的地址是不合法的,取一个#define的地址也不合法


请记住:
1.对于单纯常量,最好以const对象或enums替换#defines.
2.对于形似函数的宏,最好改用inline函数替换#define.



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值