这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » const变量与宏的区别

共2条 1/1 1 跳转至

const变量与宏的区别

高工
2018-10-17 08:21:04     打赏

const的用法有四种:参数、返回值、函数,?另一种没有想起来


用const修饰变量将限定变量为只读,该变量值不允许被改变。下面是const用于定义数组大小的一个简单例子:


  const int ArraySize = 10;

       int array[ArraySize];//仅限于C++可以这样表示。


       const变量必须初始化,这个一次性的初始化是设置其数值的唯一机会。


  const int i; //错误,没有初始化


  const也可以用于修饰指针。例如:


  char chA = 'A';

       const char chB = 'B';

       char *const ptr_1 = &chA;  //常指针

  const char *ptr_2 = &chB;  //指向常量的指针

  char const *ptr_3 = &chB;  //指向常量的指针

  const char *const ptr_4 = &chB; //指向常量的常指针  


  当const与*并存时,正确区分的原则是:如果const位于*后,则指针本身是不能被修改的(常指针),至于指针所指向的变量,则可能允许被修改;如果const位于*前,则指针所指向的变量不能被修改的,即该指针是指向常量的指针,至于指针本身,则可能允许修改。而const与类型标识的位置关系则无关紧要,所以ptr_2和ptr_3是一样的。依据这一原则,很容易判断出下面的操作是否合法。


  ptr_1 = &chB; //错误

  *ptr_1 = chB; //正确

  ptr_2 = &chA; //正确

  *ptr_3 = chA; //错误

  ptr_4 = &chA; //错误

  *ptr_4 = chA; //错误


  const也可以用于修饰引用,但不能用引用改变所指const变量的值。const定义常量对象的引用,可以用常量初始化,也可以用变量初始化。如果用变量初始化,则引用成为该变量的只读别名。也可以用常量表达式初始化const引用,但不可以用常量表达式初始化变量的引用。


  const int i = 1;

    int j = 2;

    const int &m = i;

    const int &n = j;

    int &k = i + j;  //错误

  const int &p = i + j; //正确


  定义本身为常量的引用变量是无意义的(虽然合法),因为所有引用变量自动成为常量(因为一量引用初始化,就不能引用其他变量)。


  int n;

    int &const k = n; //合法但没有意义


 #include "stdio.h"

    #define str1 "This is the first string!\n"

    void main(void)

    {

    const char str2[] = "This is the second string!\n";

    printf(str1); //为str1第一次分配内存

    printf(str2); //为str2一次分配内存,以后不再分配

    printf(str1); //为str1第二次分配内存

    printf(str2); //不再为str2分配内存

    }


  所以使用const还可以节省内存空间。



 




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


int main()


{


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


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


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


}


区别:const常量有数据类型, 而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有类型

 安全检查。而且字符替换可能会带来料想不到的边界效应。

 有些集成化工具可以对const常量进行调试, 但不能对宏量进行调试。


1.差别:const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了,#define不占用内存单元,每次调用都会分配内存。


或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。const常量存在于程序的数据段.#define常量存在于程序的代码段。


2优缺点:至于两者的优缺点,要看具体的情况了。


从执行效率上来说#define是一个更好的选择:


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


ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并。但是:如果你需要粗鲁的修改常数的值,那就的使用const了,因为后者在程序中没有实际的存在.另外在头文件中使用 #define 可以避免头文件重复包含的问题,这个功能,是const无法取代的


从执行稳健性来说用const会好一些:


 在C语言中,还有用于定义常数的宏#define,它做是值代替(即文本代替),没有类型检查工具。而const提供了类型检查,可以避免值代替时容易出现的一些问题。安全检查。而且字符替换可能会带来料想不到的边界效应。 有些集成化工具可以对const常量进行调试, 但不能对宏量进行调试。所以C++中我们一般提倡用const,C语言就看情况使用了。

--------------------- 

作者:duola_rain 

来源:CSDN 

原文:https://blog.csdn.net/duola_rain/article/details/7829816?utm_source=copy 

版权声明:本文为博主原创文章,转载请附上博文链接!




管理员
2018-10-18 09:17:48     打赏
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]