C++中,宏定义与一般的定义有什么区别?

比如
#define PI=3.141

double PI=3.141

const PI=3.141
它们之间有什么区别
什么时候应该用哪个个?
#define 好像是什么 “在编译时替换”,是什么意思啊 ,最好说具体点
还有如3楼所说“编译器直接将宏扩展成定义的内容 ”定义的是什么内容?

C/C++中的宏定义是进行符号常量定义,该定义用于定义一种符号信息用来表示一些特殊的信息,使源代码更具有可读性,同时,也可以提高系统的可移植性。宏定义是在编译时进行解释与替换的,实际运行中的代码是没有宏定义符号的。而一般变量或常量的定义在系统运行中,是有自己的内存空间,访问权限,和生存周期的。

宏定义常量

#define PI 3.141
注意:1、符号常量与数值间没有等号  2、该语句不需要以分号结尾
如:
#define PI = 3.141   语法上无大问题,但应用中可能会出错,编译时,所有的PI会替换成‘= 3.141' 
#define PI 3.141 ;   语法上无大问题,但应用中可能会出错,编译时,所有的PI会替换成‘3.141 ;’

变量定义

double PI=3.141 ; //定义一个变量PI,在内存中会给变量PI分配一个空间,其空间中存储了3.141,在使用中,可以随时改变PI值,如:PI=3.1415926;

常量定义

const  PI=3.141 ;  //因为没有写类型,默认为int类型,所以,这里的PI值实际为3
const double PI=3.141 ; //正确定义一个浮点型常量

    常量与变量的差别是:常量一经定义后,就不能再修改!如果在使用中修改PI,则编译或运行时会出错,如VC6报错:error C2166: l-value specifies const object

    常量与宏定义常量的区别是: 宏定义会在预处理阶段将用define定义的内容对代码中相应的标识符进行替换(编译期替换,编译后宏消失)。因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。const定义的常量,在程序运行时在常量表中,系统为它分配内存。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-02-14
生存域和分配空间的区别。

#define 定义,宏会从当前生效,一直到当前文件结束。
且变编译时会进行宏扩展 遇到PI 会自动被编译器替换为3.141,不会分配空间

double 和const定义遵循一般的变量生存域原则。即从当前开始到下个" }".

void test()
{

{
double k ;//k的生存域开始
..............
} //k的生存域到此结束

..............................
}
double 会为变量分配空间,const 会将常量分配到全局数据区。

由于define定义没有空间,即不能将宏的指针赋值给变量或常量。

编译时替换,因为将源代码翻译成可执行的文件时,要经过编译和链接,才能生成可执行文件(exe),也就是在这个过程中编译器直接将宏扩展成定义的内容本回答被提问者采纳
第2个回答  2015-10-08
要说区别其实也没有什么,主要都是为了使用方便,宏定义的是一个常量,一般定义可以是常亮也可以是变量,另外一般的宏定义是全局的,可以任意引用,一般的定义有一定的作用域
第3个回答  2011-02-18
#define PI=3.141 //在编译的时候替换

//下面是执行时分配单元
double PI=3.141 //变量 可以重新赋值
const double PI=3.141 //常值变量 不可以重新赋值
简单说就是double可重新赋值,而const不可重新赋值
第4个回答  2011-02-13
#define PI=3.141 //在编译的时候替换

//下面是在执行的时候分配单元
double PI=3.141; //变量,可以重新赋值
const double PI=3.141; //常值变量,不可以重新赋值
相似回答