关于C++宏定义的两个小问题

flying_music 2016-09-13 10:31:19
书上说应该用const变量替代宏变量,但给出的原因中有两个不能理解:
一是说宏定义没有类型检查,但经过测试发现VS2010中,如果用宏定义定义了#define N 10,再写成char *p = N这种形式编译器也是会提示类型错误的,那书上说的没有类型检查是在什么情况下发生的呢?
二是说宏定义定义的变量会多次分配内存,而const变量定义的不会重新分配而节省内存,但经过测试发现下面代码的输出

const double Pi=3.14159;
double i=Pi;
double j=Pi;
cout<<&i<<" "<<&j<<endl;

是不同的(VS中),那不说明i和j都分配了内存吗?哪里节省了空间呢?
...全文
346 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-09-14
  • 打赏
  • 举报
回复
关于,const 常量和 宏常量的类型安全问题, 大概如下方面,可以看出二者的区别。
const double x =12.5+100;// 类型是 double ,值为 12.5+100 =112.5
#define X 12.5+100  //X 被替换成 12.5+100 是原样替换,没有类型和值的任何信息。
例如 :
double  a = X*8 ; //替换成
double  a = 12.5 +100 * 8 ;  //a=812.5
double b =x*8 ;//计算结果为 112.5 *8 = 900.0 
编译器知道 x 是什么 但是并不知道 X是什么,只有替换后,才编译替换后的代码。 X 可能会分成几个部分,参与计算,也可能是个非法表达式 如果
const double x="123456"; //编译器会直接报告,这地方初始化错误
。。。。。。。。。。
double a =x;//
如果是
#define X “123456”  //这个定义错不错,编译器都无法知道。
//。。。。。。。。。
double a =X;//编译器到这里,才能发现,错误。
所以,定义常量 const 常量, 跟宏常量比较起来, 是有类型安全的优势的,有类型错误,可以直接指出,出错位置。 宏定义,就很难发现这种错误了。
paschen 版主 2016-09-14
  • 打赏
  • 举报
回复
问题二得看你说的宏定义的变量是哪种,宏只是替换而已 有可能直接将值作为指令的一部分,而不存在变量
paschen 版主 2016-09-14
  • 打赏
  • 举报
回复
#define N 1+2 const int a = 3; N*3 与 a * 3的结果是不同的 宏仅仅是将内容放到对应位置,而const是一种类型修饰,编译器会检查类型是否正确
lm_whales 2016-09-14
  • 打赏
  • 举报
回复
宏有两种 1) 不带参数的宏
#define N 100
#define Name "C language"
一般用于定义宏常量 也可用于,其他方面,用途广泛 2)带参数的宏。 可以执行宏替换,作用相当于函数。
    
     #define func()     { printf("12345");}
     #define func_a( a) { primr(“%d”,a);'}
     #define max(a,b)   ((a)>(b) ?(a):(b))
这种宏,一般有括号,(其实空的参数,也可以) 这种宏,和函数最显著的区别是不能检查,参数类型是否合法,返回值类型是否合法。 所以被认为是类型不安全的。 其他区别也还有,但是这种区别最大,最明显。
dustpg 2016-09-13
  • 打赏
  • 举报
回复
宏是类型不安全...用类型检查这个词太过于模糊. c++11的nullptr足以说明这一点
魔w_j剑 2016-09-13
  • 打赏
  • 举报
回复
1、书上说的没有类型检查实在编译期间,char *p = N是在运行期间检查的,肯定提示错误 2、每用一次define都会在当前代码处展开,所以每次都会申请内存(相当于每次都定义一个变量再使用),const变量定义后申请一次内存,代码其它地方可以直接访问这块内存

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧