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/