• C++ 枚举与宏


    摘要:在C语言的编程中,我们常常需要定义一些常量,此时是采用宏定义还是采用枚举类型呢?它们有哪些区别?本文主要探讨这个问题。

    一、作用域对比

    1.1宏定义的默认作用域为整个文件,如果定义了宏定义结尾的地方,作用域就到那个地方;这里有一个潜在的危险,如果我们的头文件中包含了宏定义,此时会导致宏定义没有按照程序员的意愿而产生了范围扩展,当在另外的文件中有了相同的宏定义以后,就会产生冲突导致编译无法通过。

    在C语言编程中,对一个比较大型的项目,用到的库会比较多,如果设计的稍有疏忽,便可能产生宏定义的冲突。项目中有一个例子就是发生在两个头文件都定义了“ISSPACE(ch)”这个宏,并且两个宏定义不太一致,从而导致了整个工程无法编译。

    解决该问题的方法是将该宏undefine,具体的做法是,在紧邻include语句之后对有冲突的宏进行undefine。例如库liba.h和头文件 app_pub.h就有对ISSPACE (ch)的不同定义,如果同时使用这两个文件,就会产生宏定义的冲突,这时,可以将其一个undefine(一个前提是,不是两个头文件定义的宏都会用到):

    #include "app_pub.h"
    #ifdef ISSPACE 
    #undef ISSPACE
    #endif

    这样的方法是解决宏定义冲突的一个无奈之举。事实上,宏定义的作用域早就被人诟病,特别放在头文件中,被数次包含之后,在不经意间又被覆盖,然后又被重新使用,也许此时已经不是原来的意思了,而我们在使用时还不知道。

    为此,有一个简单的原则可以减少宏定义的冲突,那就是尽量不要将宏定义置于头文件当中,除非有一个非将其置于头文件不可的理由。除此之外,还有一个策略 是,如果一个文件/库的某个函数不会被其他地方所使用,那么就不要将其置于头文件当中。头文件应该是接口,而不是麻辣烫那样的大杂烩。

    1.2枚举类型的作用域就是枚举变量的作用域,这个可控性更高。

    二、设计目的

    宏定义在编译阶段之间就已经展开,多半是为了完成“代码缩减”(某些时候有点像函数)或者“程序的易于维护性能”(某些时候有点像全局变量)。

    而枚举类型是为了实现限制输入。 另外,注意枚举成员只能是整形变量。

    https://blog.csdn.net/trochiluses/article/details/12651577

  • 相关阅读:
    [03]使用 VS2019 创建 ASP.NET Core Web 程序
    [02]为您的机器配置开发环境
    [01]从零开始学 ASP.NET Core 与 EntityFramework Core 课程介绍
    官宣 ! 52abp_Pro版本低调上线
    2019 年起如何开始学习 ABP 框架系列文章-开篇有益
    IIS配置Url重写实现http自动跳转https的重定向方法(100%解决)
    NanoFabric-ServiceFabric 操作手册
    将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1.3X
    ASP.Net Core 运行错误 Http Error 502.5 解决办法
    52ABP模板 ASP.Net Core 与 Angular的开源实例项目
  • 原文地址:https://www.cnblogs.com/Triw/p/9339676.html
Copyright © 2020-2023  润新知