30 January 2023

C++ 核心指南目录

“Prefer enumerations over macros”

理由

宏不遵循作用域范围和类型规则。另外,在预处理过程中,宏名会被删除。所以一般不会在调试工具中出现。

例子

首先是一些老的坏例子

// webcolors.h (third party header)
#define RED   0xFF0000
#define GREEN 0x00FF00
#define BLUE  0x0000FF

// productinfo.h
// The following define product subtypes based on color
#define RED    0
#define PURPLE 1
#define BLUE   2

int webby = BLUE;   // webby == 2; probably not what was desired

其实,应该使用 enum

enum class Web_color { red = 0xFF0000, green = 0x00FF00, blue = 0x0000FF };
enum class Product_info { red = 0, purple = 1, blue = 2 };

int webby = blue;   // error: be specific
Web_color webby = Web_color::blue;

这里,我们用了 enum class 避免名字冲突。

强化

  • 标记定义了整型数值的宏