c++ - 枚举是 C++ 中的宏还是整数变量?
问题描述
C++ 中是enum
宏还是变量?我对 C++ 中的宏感到困惑。C++中宏的定义是什么?
解决方案
枚举
在c++中有两种enum
:
- 枚举类
- 普通枚举
这是如何声明它们:
enum Day { sunday, monday, tuesday }; // plain enum
enum class Color { red, green, blue }; // enum class
有什么不同?
enums
- 枚举器名称与枚举{ sunday, monday, tuesday }
在同一范围内,并且它们的值隐式转换为整数和其他类型。
enum class
- 枚举器名称{ red, green, blue }
是枚举的本地名称,并且它们的值不会隐式转换为其他类型(如另一个enum
或int
)
人们普遍认为enum class
,优先于 plainenum
是因为它是 c++ 类型系统的一部分,它们不会隐式转换为int
,它们不会污染命名空间,并且可以前向声明。使用enum class
可以保护您免受一些可能出现在普通的错误中enum
。
宏
宏是完全不同的东西。宏由预处理器使用,预处理器是在编译之前处理源代码的程序。宏是程序中的一段代码,它被赋予了一些名称。每当编译器遇到此名称时,编译器都会将该名称替换为实际的代码段。该#define
指令用于定义宏。例如:
#include <iostream>
// macro definition
#define LIMIT 5
int main()
{
for (int i = 0; i < LIMIT; ++i)
{
std::cout << i << "\n";
}
}
0
1
2
3
4
宏也可以像函数一样工作
#include <iostream>
// macro with parameter
#define AREA(l, b) ((l) * (b))
int main()
{
int a = 10, b = 5, area;
area = AREA(a, b);
std::cout << "Area of rectangle is: " << area;
}
Area of rectangle is: 50
宏被预处理器替换,因此没有函数调用。这可以使代码运行得更快,但是,在 c++ 中,函数可以由编译器内联,这比使用宏更可取。如果您不仔细定义和使用宏,它们可能会出现问题。
推荐阅读
- javascript - 我正在尝试使用 join() 函数从 JavaScript 数组中创建一个大字符串,如果可能的话,是否可以包含 html
- c++ - 为什么发出空 asm 命令会交换变量?
- python - 运行返回使用 opencv 的网络摄像头捕获的帧的函数时出现问题
- python - 我正在使用 selenuim webdriver 自动执行一项任务。如何修复:get() 缺少 1 个必需的位置参数:'url'
- laravel - 在 laravel 6 中,队列在执行几个作业后自动停止,但不是全部
- sql - 如何关闭按功能分组排序,因为它占用大量资源并且在我的情况下不需要
- flutter - 如何在颤动中将剪裁器添加到导航抽屉
- sql - 如何显示每个月的总利润,当oracle中当月没有记录时显示null
- django - 如何在 Django 中渲染模板并重定向到模板的某个片段?
- swift - 异步api调用后如何执行同步api调用