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

C++ How to warning about difference between argument names in function declaration and definition

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

声明

double divide(int a, int b);

定义

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

对于使用函数 divide 的用户来说,结果是 a / b 而不是 b / a。

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

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

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

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

后一种情况:

如果您有许多相同类型的参数,那么不一致可能会成为一个问题(我见过比您的示例更糟糕的情况):

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

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

另一种解决方案是使用 setRoutines 创建参数结构。类似于:

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

这样就可以避免声明、定义和调用之间的不一致,但必须更加冗长。 (我确信在某处有关于此技术的答案。)