【问题标题】:Generating a compiler warning on bad static functions usage生成错误静态函数使用的编译器警告
【发布时间】:2016-09-13 09:18:31
【问题描述】:

我正在对一个 VS C++ 项目进行一些维护,我经常看到将静态成员函数用作类方法。

例如:

class A {
public:
    static int func(int i);
};

...
A* a = new A();
a->func(3);
...

有没有办法从编译器生成警告,以便我可以像这样清理所有源代码:

...
A::func(3);
...

因为我可以收到未使用和声明的变量的警告,所以我认为这些类型的不良成员使用应该有类似的东西,但没有运气:即使我在编译器选项中设置 /Wall 我也没有收到警告来自编译器。

【问题讨论】:

  • 为什么会有警告?这是非常好的C++。 “清理”是错误的
  • 一种快速的方法是搜索所有静态函数,将它们重命名为 static int STATIC_func(int i); 之类的名称,然后重新构建,您将在 a->func(3); 等行中得到编译器错误,所以然后将它们固定为a->STATIC_func(3);,将它们固定为A::STATIC_func(3);。最后,搜索STATIC_func 并再次将其更改为func。也许您的 IDE 支持重构,因此您可以自动进行最后一次重命名。但是请确保您有充分的理由进行“修复”。代码完全正确。
  • @Hayt 很好的发现,但是编译器错误。不过仍然相关。
  • @RichardHodges:因为如果我声明 A a; 并且我不使用它,我会收到 C4101(“未引用的局部变量”)之类的警告,那么我想我应该得到相同的如果我写:A a; a.func(1); 而不是 A::func(1); 在这两种情况下都会“浪费”变量。

标签: c++ visual-studio-2013 static-methods


【解决方案1】:

编译器不需要给出任何警告,因为对于static成员方法func(),以下两个调用都是有效的:

a->func(3);  // calling as of it's a non-static member method
A::func(3);  // calling as a proper `static` member method

但是,您正确地指出A::func(3) 对读者来说提供了更多信息,这明确表明func()static 成员。

“有没有办法从编译器生成警告...?”

不幸的是,没有办法检测出不太受欢迎的正确语法。
但是你可以执行否定编译

private: static int func(int i);  // make `func()` inaccessible outside `class A`

通过创建给定的static 方法private 来编译代码。这将在调用func() 的任何禁止位置产生错误。现在您可以更正它并再次删除 private: 说明符。
这有点乏味,但肯定是拍摄方式。

您也可以在“Eclipse-CDT”等 IDE 中使用“调用层次结构”功能,但可能会错过 templates 或一些棘手的函数调用。

【讨论】:

  • @RichardHodges,如果 OP 被分配了“代码清理”任务怎么办:-)。 IMO,将调用约定从“非静态方式”更改为“静态方式”实际上非常有效。当另一个编码人员查看代码时,他/她可以立即确定该方法是否为static,而无需查看其定义。像非静态方法一样调用static 方法会让人分心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多