我在c ++中定义了一些代码,例如:
#define array_width 3;
Visual Studio将建议更改为:
constexpr auto array_width = 3;
改变的原因是什么?有什么好处?
谢谢。
答案 0 :(得分:2)
这些建议的主要原因是,预处理器除了简单的文本替换外什么都不做(没有类型检查或编译器执行的类似操作)。使用预处理器有很多潜在的陷阱-如果可以避免,请这样做。如今,“ constexpr”是允许使用更少宏的构件之一。
要有权威地予以支持:摘自S. Meyers,Effective C ++,第2项(“ const
,enum
和inline
和#define
s“):
要记住的事情
- 对于简单的常量,相对于
const
,更喜欢enum
对象或#define
s- [...]
摘自S. Meyers,有效的现代C ++,条款15(“尽可能使用constexpr
”)
要记住的事情
constexpr
对象是const
,并使用在 编译。- [...]
与非constexpr
对象和功能相比,constexpr
对象和功能可以在更广泛的上下文中使用。
答案 1 :(得分:1)
宏通过替换文本来工作。使用宏,以下示例代码将格式错误:
struct foo
{
int array_width{};
};
因此,在现代C ++中,当有可用的替代方法时,应首选避免使用宏。为宏使用UNIQUE_PREFIX_UPPER_CASE
命名约定也是一个好主意,以避免与普通代码发生冲突。