有没有办法自定义编译错误/警告消息?

时间:2017-01-15 12:31:00

标签: c++

例如,如果我有这样的类:

class Widget {
public:
  virtual void Init(); // In this function, call some virtual function
                       // to construct the object
  void Paint();        // Deprecated, use paintWidget instead
  void PaintWidget();  // A new implementation of paint

  ...                  // Other stuff, including a virtual function
                       // which need to be called to construct the object
}

构造Widget需要一个虚函数调用(这就是我编写Widget::Init()的原因)。有没有办法对Widget::Init()进行约束,以便在使用对象之前必须调用它,如果用户违反约束则会引发错误?另一个问题是为不推荐使用的方法创建自定义警告消息。使用上面的代码,如果我的班级用户调用Widget::paint(),我怎么能告诉他们使用Widget::paintWidget()而不是弃用Widget::paint(),并告诉他们使用弃用的<div rel="tooltip" title="I workz" class="wrap"> <div class="overlap"></div> <button>I workz</button> </div> <div rel="tooltip" title="Boo!!" class="wrap poptooltip"> <div class="overlap"></div> <button disabled>I workz disabled</button> </div> .wrap { display: inline-block; position: relative; } .overlap { display: none } .poptooltip .overlap { display: block; position: absolute; height: 100%; width: 100%; z-index: 1000; } 的后果?谢谢。

2 个答案:

答案 0 :(得分:2)

问题的第1部分:

不,没有使用私有方法提供自定义消息的好方法。我要做的是确保您只有一个公共API转发到私有实现。这可以通过一些疙瘩模式或通过创建一个立面来完成。

由于你没有指定某人获取Widget的方式,我现在正在假设一个单身人士。

class Widget {
public:
    Widget() : _impl(getHoldOfPrivateWidgetViaSingleton())
    {
         _impl.init();
    }
    // ...
private:
    PrivateWidget &_impl;
};

// Note: rename of the Widget in your example
class PrivateWidget {
private:
    friend class Widget;
    PrivateWidget();
    // ...
};

这样做的缺点是你必须编写一些/大量的转发代码。

问题的第2部分:

class Widget {
public:
  void Init();
  [[deprecated("use paintWidget instead")]] void Paint();
  void PaintWidget(); // A new implementation of paint
  ...
private:
  Widget();
  ...
}

请注意,如果您无法访问启用了C ++ 17的现代编译器,则可能需要查看编译器特定的属性。

答案 1 :(得分:1)

您可以使用 #warning 指令,大多数广泛使用的编译器(GCC,VC,Intels和Mac)都支持#warning消息。

#warning "this is deprecated, use the Init() method instead"

一个好的方法是不仅要显示一个警告(人们可以忽略),而是使用#error指令(非常标准)使编译失败:

#  error "this method is forbidden and private"

作为特定于Visual Studio的solution,您可以使用 pragma