C/C++中define定义的常量与const常量

  常量是在程序中不能更改的量,在C/C++中有两种方式定义常量,一种是利用define宏定义的方式,一种是C++中新提出来的const型常变量,下面主要讨论它们之间的相关问题;

  define定义的常量:

  define是预处理指令的一种,它用来定义宏,宏只是一个简单的替换,将宏变量所对应的值替换,如下面的代码:

#define NUM 2
int main()
{
    printf("%d", NUM);
}

编译器在编译时处理的并不是这样的代码,编译器会首先处理预处理指令,根据预处理指令生成相关的代码文件,然后编译这个文件,得到相关的.obj文件,最后通过链接相关的.obj文件得到一个可执行文件,最典型的是我们一般在.cpp文件中写的#include指令,在处理时首先将所需包含的头文件整个拷贝到这个.cpp文件中,并替换这个#include指令,然后再编译生成的文件,这个中间文件在Windows中后缀为.i,在Visual C++ 6.0中以此点击Project-->Settings-->C/C++,在Project Options最后一行加上‘/P‘(P为大写)这样在点击编译按钮时不会编译生成obj文件,只会生成.i文件,通过这个.i文件可以看到在做预处理的时候会将 NUM替换成2然后在做编译处理,这个时候点击生成时会出错,因为我们将编译选项修改后没有生成.obj文件但是在生成时需要这个文件,因此会报错,所以在生成时要去掉这个/P选项。而我们看到在使用const 定义的时候并没有这个替换的操作,与使用正常的变量无异。const型变量只是在语法层面上限定这个变量的值不可以修改,我们可以通过强制类型转化或者通过内嵌汇编的形式修改这个变量的值,比如下面的代码:

int main(int argc, char* argv[])
{
    const nNum = 10;
    int *pNum = (int*)&nNum;
    printf("%d\n", nNum);
    return 0;
}
    const nNum = 10;
    __asm
    {
        mov [ebp - 4], 10
    }
    printf("%d\n", nNum);
    return 0;

但是我们看到,这两种方式修改后,输出的值仍然是10,这个原因我们可以通过查看反汇编代码查看

;printf("%d\n", nNum);
00401036   push        0Ah
00401038   push        offset string "%d\n" (0042001c)
0040103D   call        printf (00401070)
00401042   add         esp,8

在调用printf的时候,入栈的参数是10,根本没有取nNum值得相关操作,在利用const定义的常量时,编译器认为既然这是一个常量,应该不会修改,为了提升效率,在使用时并不会去对应的内存中寻址,而是直接将它替换为初始化时的值,为了防止这种事情的发生,可以利用C++中的关键字:volatile。这个关键字保证每次在使用变量时都去内存中读取。

我们可以总结出const和define的几个不同之处:

1)define是一个预处理指令,const是一个关键字。

2)define定义的常量编译器不会进行任何检查,const定义的常量编译器会进行类型检查,相对来说比define更安全

3)define的宏在使用时是替换不占内存,而const则是一个变量,占内存空间

4)define定义的宏在代码段中不可寻址,const定义的常量是可以寻址的,在数据段或者栈段中。

5)define定义的宏在编译前的预处理操作时进行替换,而const定义变量是在编译时决定

6)define定义的宏是真实的常量,不会被修改,const定义的实际上是一个变量,可以通过相关的手段进行修改。

时间: 2024-11-06 17:35:37

C/C++中define定义的常量与const常量的相关文章

宏常量,宏替换,const常量

(1)宏常量也称为符号常量,是指用一个标识符号来表示的常量,宏常量是由宏定义编译预处理命令来定义的,宏定义的一般形式:#define 标识符 字符串 宏定义中的标识符被称为宏名,将程序中出现的宏名替换成字符串的过程称为宏替换,宏替换时是不做任何语法检查的,因此,只有在对已经被宏展开后的源程序进行编译时才会发现语法错误 (2)const常量:使用宏常量的最大问题是,宏常量没有数据类型.那么是否可以声明具有某种数据类型的常量呢?这就是const常量 const常量被编译器放在只读存储区,不允许在程序

深入分析php中const和define定义常量的区别

const和define在php中都是定义常量了,但是它们的具体区别是什么?其实非常的简单const用于类成员变量定义,一旦定义且不能改变其值.define定义全局常量,在任何地方都可以访问 页define不能在类中定义而const可以了,下面整理了一篇文章. 大家都知道define是定义常量的,如果在类中定义常量呢?当然不能用define,而用const,如下例: <?php define('PHP', 'I love PHP'); // 在类外面通常这样定义常量 if (defined('P

在php中定义常量时,const与define的区别

[问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很多. (1).const用于类成员变量的定义,一经定义,不可修改.define不可用于类成员变量的定义,可用于全局常量. (2).const可在类中使用,define不能. (3).const不能在条件语句中定义常量. 例如: if (...){ const FOO = 'BAR';  // 无效的

宏定义(#define)和常量(const)的区别

最近开始准备一边做实验室的研究,一边记录一些遇到的编程中的小知识点.今天在测试对矩阵进行SVD分解时,需要定义矩阵的行和列的大小,我习惯性的用宏定义来定义了这两个变量,在运行的时候,就开始思考宏定义和常量之间有些什么样的分别. 参考了一些别人的说法,自己在这里做一个小小的总结. 类型和安全检查不同 宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误: const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查 编译器处理不同 宏定义是一个“编译时”

C语言中宏定义(#define)时do{}while(0)的价值(转)

C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值主要体现在: 1. 增加代码的适应性 下面的宏定义没有使用do{...}while(0) #define FOO(x) foo(x); bar(x); 这样宏定义,单独调用不会出现问题,例如: FOO(100) 宏扩展后变成: 1 f

可以DEFINE 定义常量数组了

php7 可以define 定义常量数组了 利用php7的define定义数组 <?php define('language', ['php', 'java', 'jsp', 'asp']); echo language[1]; 输出java

const常量和#define宏常量的区别

http://blog.csdn.net/lifengguo_njupt/article/details/7992332 C++可以用const定义常量,也可以使用#define来定义常量,但是前者比后者有更多的优点: 1,const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行静态类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能产生意想不到的错误(边际效应) 2,有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试. 所以在C++中

关于C++中的Const常量

一. 为什么需要常量 (1)如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦: 1. 程序的可读性(可理解性)变差.程序员自己会忘记那些数字或字符串是什么意 思,用户则更加不知它们从何处来.表示什么. 2. 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误. 3. 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错. (2)尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串. 例如: #define MAX 100 /* C 语言的宏常量 */ co

C++中#define用法

http://blog.sina.com.cn/s/blog_686188ef0100klku.html #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利.1 #define命令剖析1.1 #define的概念#define命令是C语言中