C++中const与define的区别

const常量有数据类型,而宏(#define定义的)没有数据类型。编译器可以对const常量进行类型检查,而对宏只进行字符替换没有类型检查;const 可以用来修饰函数参数、函数返回值,在C++里还可以用来修饰函数,定义类中某个成员函数为常量函数;有些编译器还可以对const常量进行调试,但不能对宏常量进行调试。

什么是宏(macro)

在编程语言中,宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。C语言和C++语言中用#define来进行宏定义的。关于宏(macro),首先必须是合法的标识符,其次是宏中括号内的元素为宏参数(和函数的参数差不多),另外宏名的括号中的内容只能出现标识符和逗号,并且必须要标识符开头和结尾,逗号不能连续。

如下例子可以帮助你正确的认识宏:

以下宏定义是正确的:

1
2
3
4
#define FUN(a) 10        //正确,但似乎没有任何意义,如果a是表达的话,那么它不会被执行
#define FUN(a) (10)
#define FUN (10)
#define FUN(a,b) 10

以下宏定义是错误的:

1
2
3
4
5
#define (a) 10                    //宏名必须为标识符
#define FUN(5) (10)            //宏参数必须为标识符
#define FUN(a*b) (a*b)       //宏参数列表中不能有特殊符号
#define FUN(a,,b) (a+b)       //宏参数列表中不能有连续的逗号
#define FUN(a,10) (a*10)     //宏参数列表中不能有常量

举例:写一个含有两个参数的标准宏MAX,求二者中最大的那个数

1
#define MAX(a,b) ((a)>(b)?(a):(b))

宏能做什么

使用宏可以减少编程错误。
宏可以方便的产生嵌入代码。
在某些情况下使用宏定义可以提高程序效率。

宏与内联函数的区别

内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用。编译时内联函数代码直接嵌入到目标代码中,而宏只是简单的字符替换。内联函数要做类型检查,相对于宏来说更安全可靠。内联函数用于以下情况更为方便:一个函数被不断调用,函数只有简单的几行代码,且函数内不包含for、while、switch等语句。

什么是const

const是contant(常量)的缩写,是一个C语言(C++及其他编程语言)的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

下面两个例子可以帮助你掌握const用法

(1)、

1
2
3
const char *p
char const *p
char * const p

第1个和第2个相同,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量,不能修改指针指向对象的内容;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量,不能修改指针的指向。

(2)、

1
2
3
4
5
6
7
8
9
char str1[]       = "abc";
char str2[]       = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5  = "abc";
const char* str6  = "abc";
cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?

这个你自己去找结果吧。// 原文出处:http://chenzhiwei.net/2010/12/the-difference-between-const-and-define/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值