• C++ 宏定义与常量


    原文: http://blog.csdn.net/t894690230/article/details/50605021

    前言:突然想起很久之前上课时被问及C++ 宏定义与常量的区别,仔细了想了想,并没有答起(尴尬),这次就简单总结一下C++宏常量与常量的区别吧。

    1. 宏定义

    宏定义是C语言提供的三种预处理中的一种,又称为宏代换、宏替换,简称“宏”,用#define定义,如下:

    #define Pi 3.1415926
    • 1
    • 1

    宏常量没有类型,它是在编译前即预编译阶段进行字符替换,就好比如下的例子:

    S = PI * r * r
    • 1
    • 1

    在预编译阶段,直接将PI替换成3.1415926,同时没有类型安全检查,系统也不会为它分配内存。

    宏定义使用#undef符号终止宏定义的作用域。

    2. 常量

    常量则是一种标识符,它的值在运行期间恒定不变。常量使用关键字const定义,如下:

    const float PI = 3.14159;
    • 1
    • 1

    常量是在运行时进行替换,并且在编译时会进行严格的类型检验,同时系统也会为常量分配内存。

    3. 区别

    如上所述,C++语言可以用const 来定义常量,也可以用#define来定义宏常量。但是两者的区别在于:

    • const 常量有数据类型,而宏常量没有数据类型;
    • const 常量在运行时进行替换,宏常量则是在预编译截断进行替换,const 常量在编译阶段会进行类型安全检查,宏常量则不会;
    • 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

    4. 附录

    在实际使用中,由于宏常量在预编译时只是进行简单的字符替换,而不会进行编译检查,所有应该特别注意宏常量的使用,譬如如下代码:

    #define N 3 + 2
    
    float a = 2 * N
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    预想的值应该是a=10,但实际结果却是a=8,这是因为宏常量N在预编译阶段直接将字符替换,变成了如下代码:

    float a = 2 * 3 + 2
    • 1
    • 1

    这也叫宏定义的“边缘效应”。

    另外根据规则5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量。

  • 相关阅读:
    web.xml配置详解
    javascript实现的网页打印
    C#实现新建文件并写入内容
    nodeJs学习过程之认识nodejs
    windows下nodejs与coffeeScript环境搭建
    javascript/css压缩工具---yuicompressor使用方法
    verilog描述表决器的两种方式简易分析
    verilog阻塞与非阻塞的初步理解(二)
    verilog阻塞与非阻塞的初步理解(一)
    FIFO学习心得
  • 原文地址:https://www.cnblogs.com/oxspirt/p/6484070.html
Copyright © 2020-2023  润新知