#define更改为constexpr auto

时间:2019-05-20 09:44:25

标签: c++ visual-studio

我在c ++中定义了一些代码,例如:

#define array_width 3;

Visual Studio将建议更改为:

constexpr auto array_width = 3;

改变的原因是什么?有什么好处?

谢谢。

2 个答案:

答案 0 :(得分:2)

这些建议的主要原因是,预处理器除了简单的文本替换外什么都不做(没有类型检查或编译器执行的类似操作)。使用预处理器有很多潜在的陷阱-如果可以避免,请这样做。如今,“ constexpr”是允许使用更少宏的构件之一。

要有权威地予以支持:摘自S. Meyers,Effective C ++,第2项(“ constenuminline#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命名约定也是一个好主意,以避免与普通代码发生冲突。