C++ 用枚举类型替代宏定义连续的常量

简介: C++ 用枚举类型替代宏定义连续的常量

用define定义16种颜色常量要写16行代码,改成枚举类型后只要一两行就搞定:


#define    cBlack     0
    #define    cNavy      1
    #define    cGreen    2
    #define    cTeal       3
    #define    cMaroon  4
    #define    cPurple    5
    #define    cOlive      6
    #define    cSliver     7
    #define    cGray      8
    #define    cBlue       9
    #define    cLime      10
    #define    cCyan      11
    #define    cRed        12
    #define    cMagenta 13
    #define    cYellow     14
    #define    cWhite      15



• enum cColor{ cBlack=0,cNavy,cGreen,cTeal,cMaroon,cPurple, cOlive, cSliver,
•        cGray,   cBlue,cLime, cCyan,cRed,   cMagenta,cYellow,cWhite };


之前写的《重载操作符<<实现cout定位输出以及设置颜色》,其代码就可以改进为:

#include <iostream>
#include <windows.h>
using namespace std;
struct HannsC { DWORD fc; DWORD bg; };
struct HannXy { SHORT pX; SHORT pY; };
enum cColor{ cBlack=0,cNavy,cGreen,cTeal,cMaroon,cPurple, cOlive, cSliver,
       cGray,   cBlue,cLime, cCyan,cRed,   cMagenta,cYellow,cWhite };
HannsC setC(DWORD fc = 7, DWORD bg = 0)
{
  fc %= 16, bg %= 16;
  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(hConsole,fc|bg<<4);
  return {fc, bg*16};
}
HannXy Goto(SHORT x = 0, SHORT y = -1)
{
    CONSOLE_SCREEN_BUFFER_INFO pBuffer;
  COORD position = {x, y};
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 
  if (position.Y==-1){
    GetConsoleScreenBufferInfo(hConsole, &pBuffer); 
    position.Y = pBuffer.dwCursorPosition.Y;
  }    
    SetConsoleCursorPosition(hConsole, position);
  return {x, y};
}
ostream& operator<<(ostream& _os, HannsC _mc) { return _os;}
ostream& operator<<(ostream& _os, HannXy _xy) { return _os;}
ostream& cr(ostream& _os) { _os.put('\n');_os.flush();return _os;}
int main(void)
{
  cout << setC(cNavy,cLime) << "abcdefghijklmnopqrstuvwxyz" << cr;
  cout << Goto(16,3) << setC(cYellow,cBlue) << "abcdefghijkl" 
     << setC(cBlue,cYellow) << Goto(30) << 123 << cr << cr;
  cout << setC(cMagenta,cOlive) << 12312303236131230 << cr;
  cout << setC(cGreen,cWhite) << Goto(18,9) << "3.1415926535897932384626";
  cout << Goto(30) << setC(cRed) << "END!" << Goto() << "cr && !lf";
  cout << setC(cCyan) << cr << cr << "my C++ version: " << __cplusplus ;
  cout << setC() << cr;
  return 0;
}


同时,也把原来放在 operator<<() 中的实现功能部分,移到setC()和Goto()函数中,这样更好理解可读性更好。


目录
相关文章
|
6月前
|
编译器 C++
C++程序中的常量
C++程序中的常量
52 0
|
3月前
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
32 1
|
5月前
|
安全 数据库连接 C++
C++一分钟之-C++中的常量与宏定义
【6月更文挑战第18天】**C++编程中,常量(`const`和`constexpr`)确保值不变,用于配置、计算和逻辑控制。宏定义是预处理阶段的文本替换,适用于条件编译和简化代码。注意`const`的正确使用,避免过度的`const_cast`。宏可能导致命名冲突、副作用和类型安全问题,应谨慎使用。优选类型安全的常量定义,以提升代码质量和可维护性。**
68 5
|
4月前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
5月前
|
C++
C++之变量与常量
C++之变量与常量
|
5月前
|
存储 安全 API
C++一分钟之-C++中的枚举类型(enum class)
【6月更文挑战第25天】C++的`enum class`(强类型枚举)在C++11中引入,增强了枚举的作用域和类型安全,减少命名冲突。它要求使用全名(如`Color::Green`)访问枚举成员,并能显式指定底层类型。常见问题包括默认值非0、隐式转换和范围溢出,解决办法是明确赋值、显式转换和选择合适底层类型。高效技巧包括用于状态机、作为函数参数、创建别名和迭代。掌握这些能提升代码质量。
148 0
|
6月前
|
安全 C++
C++程序中的枚举类型
C++程序中的枚举类型
50 1
|
6月前
|
程序员 编译器 C++
c++常量
c++常量
58 0
|
6月前
|
存储 编译器 程序员
C++中的宏定义和字符串字面值的区别
C++中的宏定义和字符串字面值的区别
|
6月前
|
编译器 C++
C/C++杂谈——指针常量、常量指针
C/C++杂谈——指针常量、常量指针
44 0