C ++如何警告函数声明和定义中参数名称之间的区别

时间:2016-11-04 10:36:36

标签: c++ static-analysis

有没有办法得到关于函数声明与其定义之间的参数名称不匹配的警告?

声明

double divide(int a, int b);

定义

double divide(int b, int a)
{
    return a / b;
}

对于使用函数divide的用户,预期会产生a / b而不是b / a。

我知道,编译器不能这样做,但是有一些静态分析工具可以做到吗?如果是,那是哪一个?

3 个答案:

答案 0 :(得分:10)

你可以使用clang-tidy。将它称为编译器有点紧张,但也许有一个选项可以让clang发出clang-tidy警告。您需要的具体选项是readability-inconsistent-declaration-parameter-name

答案 1 :(得分:0)

编译器不关心声明中的参数名称,你甚至可以写void foo(int, int);,所以没有不匹配,并且没有这样的警告。如果由于某种原因发现这种不匹配令人困惑,只需在声明中省略参数名称。

答案 2 :(得分:0)

您是否只对检查现有代码感兴趣,或者确实希望确保代码避免此问题并愿意重新设计接口?

在后一种情况下:

如果您有许多相同类型的参数,那么不一致可能是一个问题(我看到的情况比您的示例更糟):

void foo(bool fast, bool small, bool trivial);
foo(true, false, false);

您要求的是确保foo的声明和定义一致的方法 - 但是您忽略了调用和声明之间的不一致。

另一种解决方案是使用setRoutines创建一个argument-struct。类似的东西:

struct FooArg {
   bool fast, small, trivial;
   FooArg &setFast(bool fast_) {fast=fast_;return *this;}; 
   ...
};
void foo(FooArg const&);
foo(FooArg().setFast(true).setSmall(false)...);

然后,您可以避免声明,定义和调用之间的不一致,但必须更加详细。 (我确信在某个地方有关于这种技术的答案。)