`
yangyou230
  • 浏览: 1647850 次
文章分类
社区版块
存档分类

C++中const与#define的区别

 
阅读更多

C++语言可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的优点。

const与define的区别主要表现在以下几个方面的内容:

(1)(a) const定义常量是有数据类型的:这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量没有数据类型,只是进行简单的字符替换,没有类型安全检查,且有时在字符替换中还会产生边际效应。所谓边际效应举例如下:

#define N 100
#define M 200 + N

当程序中使用 M*N 时,原本想要 100 * (200+ N )的却变成了 100 * 200 + N。

(b)#define宏定义常量却没有。#define <宏名><字符串>,字符串可以是常数、表达式、格式串等。在程序被编译的时候,如果遇到宏名就对指定的字符串进行替换,然后再进行编译。

(2)define是宏定义,const是修饰符。宏定义在代码进行编译器前就被预处理程序处理掉了,而修饰符不会,所以有些集成化的调试工具可以对const常量进行测试,但是不能对宏常量进行调试。建议在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

(修饰符用来指定被修饰的对象具有某个特定的属性,在C++中,共有以下修饰符:static const inline)

(3)当定义局部变量时,const作用域仅限于定义局部变量的函数体内。但用#define时其作用域不仅限于定义局部变量的函数体内,而是从定义点到整个程序的结束点。但也可以用#undef取消其定义从而限定其作用域范围。只用const定义常量,并不能起到其强大的作用。const还可修饰函数形式参数、返回值和类的成员函数等。从而提高函数的健壮性。因为const修饰的东西能受到c/c++的静态类型安全检查机制的强制保护,防止意外的修改。

(4)define是宏定义,const是修饰符。宏定义在代码进行编译器前就被预处理程序处理掉了,而修饰符不会。

说明:以下内容摘自《程序员面试宝典》

常量的引进是在早期的C++版本中,当时标准C规范正在制订。那时,常量被看做一个好的思想而被包含在C中。但是,C中的const的意思是“一个不能被改变的普通变量”。在C中,它占用内存,而且它的名字是全局符。C编译器不能把const看成一个编译期间的常量。在C中,如果写:

const bufsize = 100;

char buf[bufsize];

尽管看起来好像做了一件合理的事,但这将得到一个错误的结果。因为bufsize占用内存的某个地方,所以C编译器不知道它在编译时的值。在C语言中可以选择这样书写:

const bufsize;

这样写在C++中是不对的,而C编译器则把它作为一个声明,这个声明指明在别的地主有内存分配。因为C默认const是外部连接的,C++默认const是内部连接的,这样,如果在C++中想完成与C中同样的事情,必须用extern把内部连接改成外部连接:

extern const bufsize;//declaration only

这种方法也可以用在C语言中。在C语言中使用限定符const不是很有用,即使是在常数表达式里(必须在编译期间被求出)想使用一个已命名的值,使用const也不是很用的。C迫使程序员在预处理器里使用#define.

分享到:
评论

相关推荐

    C++中const与#define的利弊分析

    C++中const与#define的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在...

    c++ 尽量不要使用#define 而是用const、enum、inline替换。

    例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 … … 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛...

    C/C++:const常量与define宏定义的区别

    (1) 编译器处理方式不同  define宏是在预处理阶段展开。...  const常量会在内存中分配(可以是堆中也可以是栈中)。  (4)const 可以节省空间,避免不必要的内存分配。 例如: #define PI 3.14159 //常量宏

    C/C++中的typedef和#define详解

     在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的关键字,一个是C/C++的宏定义命令,typedef用来为一...

    C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别

    C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别 pragma once 之前一直用的很好,今天和同事的配合中发现自己没有真正理解pragma once。 原因:同事喜欢把公共的头文件通过生成后事件复制到一个公共的...

    [C++中】const常量与define宏定义的区别

    较详细地介绍了const常量与宏定义的区别

    const 限定符的使用

    const限定符的使用,以及const 与 #define 的区别

    C++中const用法总结.doc

    C++中const用法总结.doc C++中const用法总结.doc 1. const修饰普通变量和指针 2. const修饰函数参数 3. const 修饰函数返回值 4. const修饰类对象/对象指针/对象引用 ...7. const常量与define宏定义的区别

    跟我一起学C++

    const定义的常量与#define定义的符号常量的区别 const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换 const定义的常量在编译时分配内存,而#define定义的...

    C语言中const和C++中的const 区别详解

    C++的const和C语言的#define都可以用来定义常量,二者是有区别的,const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查。 而C语言中的const与...

    C++中const用法总结

    本文档介绍了C++中const用法,希望对大家有帮助

    详解C++中的const关键字及与C语言中const的区别

    const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量。此变量只存在于那个文件中中,不能别其他文件访问。要是const变量能在其他文件中访问,必须...

    C++日志模块DLL,源码

    #define LL_DEBUG 0 #define LL_INFO 1 #define LL_WARN 2 #define LL_ERROR 3 #define LL_ALARM 4 #define GetCurFileName (__FILE__) #define GetCurCodeLine (__LINE__) #define GetCurCodeFunctionName (__...

    浅谈关于C语言中#define的副作用

    但是在高级语言中,甚至C++中,是提倡用const的,不提倡用#define,因为#define有一定的副作用,玩不好就没命了。 这里我们讨论下#define的副作用。 # include # include # define CALL_WITH_MAX(a,b) f((a)&gt;(b)?...

    C/C++中CONST用法总结(推荐)

    主要介绍了C/C++中CONST用法总结(推荐),包括const常量与define宏定义的区别介绍,非常不错,具有参考借鉴价值,需要的朋友参考下吧

    高质量C\C++编程指南

    目录 前 言 第1 章文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 头文件的作用 ...5.2 CONST 与#DEFINE 的比较 5.3 常量定义规则 5.4 类中的常量 第6 章函数设计 …………省略

    浅析c++ 中const关键字

    define与const的区别 1.define作用在预处理时,是简单地字符替换 2. const作用在编译时,具有类型检查的功能 3. const必须进行初始化 常量指针与指针常量 #include using std::endl; using std::cout; int main()...

    C++判断点是否在多边形内

    #define max(a,b) ((a&gt;b)?a:b) #define min(a,b) ((a)?a:b) using namespace std; const double INFINITY = 1e10; const double ESP = 1e-5; const int MAX_N = 1000; //定义点 struct Point { double x, y;...

Global site tag (gtag.js) - Google Analytics