我知道通过实例对象调用静态方法是explicitly allowed。
但是如果我想手动避免它,我怎么能在调用发生时收到警告?我的意思是,是否有一些编译器选项(或一些特殊属性)来检查情况?
我正在使用Clang,但欢迎任何其他编译器特定功能。
答案 0 :(得分:5)
答案是否定的。根据其他Q& A,标准要求并允许此行为。见n3797 s9.4 / 2:
可以使用qualified-id表达式X :: s引用类X的静态成员;没有必要使用类成员访问语法(5.2.5)来引用静态成员。 可以使用类成员访问语法引用静态成员,在这种情况下,将评估对象表达式。
鉴于这种直言不讳的语言,任何编译器如何做你所要求的?
也许您应该寻找一个版本的lint。我发现http://stellar.cleanscape.net/products/cpp/checks.html和错误1705可能是您想要的,我相信还有其他人。
所以问题是为什么lint,而不是编译器。这里有灰色阴影,但我认为编译器警告通常保留用于或可能或可能实际上是错误的事物。它们可能是未定义的行为,或实现定义的,或者编译器执行的操作与预期不同的地方。通过指针调用静态方法不属于该类别。它绝对是标准的要求,并准确生成您期望的代码。
编译器不是用于执行编码标准,还有其他工具。在C / C ++ Unix世界中,历史上lint使您能够检测并抱怨违反编码标准,而不是编译器。在.Net世界中,它一直是FxCop,尽管现在Visual Studio做了大部分相同的事情。当您希望代码满足特定标准时,您需要一个执行静态代码分析的工具,例如此列表here。
如果这不能回答你的问题,也许你可能想问另一个问题。就这一点而言,我确信编译器通过实现标准而不发出警告来做正确的事情。
答案 1 :(得分:1)
使用CppDepend和CQlinq,您可以检测调用所有静态方法的位置,并在手动检查之后
例如,您可以执行以下查询: