C++如何防止我的团队开发人员错误地使用整数版本的abs

C++ How can I prevent my team developers from using integer version of abs by mistake?

本文关键字:整数 版本 abs 错误 何防止 我的 团队 开发 C++      更新时间:2023-10-16

我的团队正在编写要为Windows(使用VS2015)和Android(使用由QtCreator调用的GCC 4.9)编译的代码。

我们发现Android二进制文件的abs功能有问题。

double a = 1.0;
double b = 0.5;
std::cout << abs( a - b ) << std::endl;
std::cout << std::abs( a - b ) << std::endl;

显示器:

1
0.5

这是一个已知的问题,发现了这个主题(以及其他主题):我最近在中遇到了使用abs()的奇怪错误

有很多地方我们使用abs,我会用std::abs来代替它们。很好但是我如何防止abs在将来再次被使用

找到了这个主题:使用abs()避免编译器问题,但它没有帮助。

我不能启用将所有警告都视为错误(-Werror-Wall),因为g++的权限远不如MSVC。即使我们努力在MSVC上使用0警告进行编译,我们仍然会得到大量带有g++的警告(其中可能有一个关于abs使用不当的警告),而我们历来忽略了它们。修复所有这些问题需要我们付出太多的努力。

您是否可以在中心位置设置强制性的编译器标志(常见的cmake包含或您使用的任何其他构建系统)?如果是这样,您可以创建一个如John所示的头文件,并添加一个编译标志,该标志将包括任何编译单元开头的文件:

MSVC:/FI<路径_文件>

GCC:-include<路径_文件>

Clang:与GCC 相同

您有一个基本上包含在所有内容中的头文件吗?某种持有所有基本面的人?如果是这样,你可以把这个放在那里:

extern void NeverDefined();
inline int abs(int a) {
    NeverDefined();
    return a;
} // abs(int)

如果你在NeverDefined上得到一个链接器错误,你就会知道有问题了!

通常情况下,我不会定义有问题的函数,但由于它是一个库函数,我必须有第二个级别。

编辑

事实上:不要为头文件而烦恼(标准定义就足够了)。用上面的代码(没有inline)编写您自己的abs.cc,它将取代库定义。

当然,如果原始文件标记函数inline,这将不起作用——在这种情况下,您可以始终编辑原始定义。。。

正如您的问题的同一链接答案中所建议的:

  1. <math.h>负责abs(int)
  2. <cmath>负责std::abs(double)

如果你有一个最顶端的头文件,那么简单地放下面的方法:

template<typename T> void abs (T);

因此,无论在哪里找到abs,都会报告其void编译器错误作为返回值。此外,此函数未实现,至少会导致链接器错误
此编译器错误可用于将此类abs()替换为std::abs()。对于无害的abs(int),这预计不会产生任何错误,因为它在<math.h>中可用。

假设所有源文件中都没有包含任何头文件,那么作为一次性练习,您可能希望用#include<cmath>替换#include<math.h>的每个文本。然而,这并不是所有情况下的充分证明。例如:

double my_abs () {
  using std::abs;
  return abs(x - y);
}

因此,作为一种实践,在所有源文件中都有一个通用的实用工具头文件是很好的。让它空着吧。