The different between #define and const for a constant in C

2024-04-30 04:38

本文主要是介绍The different between #define and const for a constant in C,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这应该算一个经常争论的话题,而且往往没有个结果。

虽然他们在使用中感觉“差不多”,但是他们在实现上有什么区别?

请看下面的代码:

3:    #define T 13 /*用#define定义的一个常量T*/

4:

5:    int main()

6:    {

00401000   push        ebp

00401001   mov         ebp,esp

00401003   sub         esp,4Ch

00401006   push        ebx

00401007   push        esi

00401008   push        edi

00401009   lea         edi,[ebp-4Ch]

0040100C   mov         ecx,13h

00401011   mov         eax,0CCCCCCCCh

00401016   rep stos    dword ptr [edi] /*以上均是初始化(这个词不太准确,在我没有想到更好的之前先用他吧^_^)操作,不管他。*/

7:

8:        const int t=13;/*用const定义的一个常量*/

00401018   mov         dword ptr [ebp-4],0Dh /*const常量t在堆栈中分配了一块空间保存其值0xD=13*/

9:

10:       int n=t;/*把t赋值给n*/

0040101C   movsx       eax,dword ptr [ebp-4] /*把储存在堆栈中的const常量t取出,传递到eax*/

00401020   mov         dword ptr [ebp-8],eax /*把eax的值赋给变量t([edp-8]是t的空间的起始地址,又是4 dword,VC就是粗犷啊:P)*/

11:       int m=T;/*把T赋值给m*/

00401023   mov         dword ptr [ebp-0Ch],0Dh /*把0xD(13)赋值到变量m([edp-0Ch]是他的起始空间)*/

[以上代码来自VC++ 6.0]

从上面这段代码可以看出,const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。

const常量存在于程序的数据段,#define常量存在于程序的代码段。

至于两者的优缺点,要看具体的情况了。一般的常数应用,我个人认为#define是一个更好的选择:

i.从run-time的角度来看,他在空间上和时间上都有很好优势。

ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并(在上例中T*10将被0x82取代)。

但是:如果你需要粗鲁的修改常数的值,那就的使用const了,因为后者在程序中没有实际的存在。(其实应该说修改数据段比代码段要简单^_^)。

http://kaby.blogdriver.com/kaby/171539.html

这篇关于The different between #define and const for a constant in C的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947921

相关文章

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

s let 和const的区别 ,它们可以变量提升吗

在 JavaScript 中,let 和 const 是 ES6 引入的新变量声明关键字,它们与之前的 var 关键字相比,有几个重要的区别。特别是关于变量提升(hoisting)的行为不同。 变量提升(Hoisting) 在 JavaScript 中,“变量提升”是指变量声明会被提升到作用域的顶部,但变量的初始化不会。这意味着你可以先使用变量,然后再声明它。然而,let 和 const 的行

2、#include和#define

#include和#define 一、#include二、#define宏定义1、宏变量2、宏函数 一、#include #include是预处理指令,会将头文件直接替换到文件中。 // hello.hvoid foo() {int c = 0;int d = 1;}// hello.cpp#include "hello.h"int main() {int a =

C++中const关键字的使用方法,烦透了一遍一遍的搜,总结一下,加深印象!!!

之前一直在学习C/C++,关于const的使用,这里出现一点,那里出现一点。知识用时方恨少,这一段时间正好各种笔试题,其中关于const的用法也是层出不穷,所以疲于在书本上各种翻,这里汇总一下,加深自己的印象的同时,也方便以后查阅和学习。菜鸟一个,若有错误,望指正! const关键字 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。不管出现在任何上

const与#define的优缺点

1.define由预处理程序处理,const由编译程序处理 2.#define不分内存,因为它是预编译指令,编译前进行了宏替换。const 不一定?某种说法,Const常量是占有内存的被“冻结”了的变量 3.const定义常量是有数据类型的,这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际

Page directive: illegal to have multiple occurrences of contentType with different values (x,X)之解

Question: Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html; charset=utf-8, new: text/html;charset=UTF-8) Analysis: 出现这个的原因是这两个jsp的contentT

【C++】类中成员函数声明后面接 const

const 表示对类中成员函数属性的声明; 表示不会修改类中的数据成员; 在编写const成员函数时,若不慎修改了数据成员,或者调用了其他非const成员函数,编译器将指出错误; 以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。 class Stack{public:void Push(int elem);int Pop(vo

【C++】define宏定义中的#,##,@#及\符号

一、# 名称:字符串化操作符 其作:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 使用条件:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前 举例: #define example1(instr) #instr string str=example1(abc); 将会展成:string str="abc"; 注意:对空格的处理 a、忽略传入参数名前面和后

【C++】C++中的关键字:const、mutable、auto、new....

七、C++中的关键字:const、mutable、auto、new、 本部分打算是尽量多的罗列出C++中的关键字和一些花式操作。先总结一下我们之前讲过的:private、public、protect: 参考【C++】类、静态、枚举、重载、多态、继承、重写、虚函数_静态与多态:重写、重载、模板-CSDN博客中的第5小标题,可见性。static: 参考【C++】类、静态、枚举、重载、多态、继承、重写

[跨平台C++] 返回const char* 类型的函数样板

返回const char*类型的函数 方法1: const char* GetPathByFileNameFull(const char* szFileName_Full) { // const char* p = strchr(szFileName_Full,'\\'); //start 0 position find "\\"const char* p = strrchr(szF