C++如何防止我的团队开发人员错误地使用整数版本的abs
C++ How can I prevent my team developers from using integer version of abs by mistake?
我的团队正在编写要为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
,这将不起作用——在这种情况下,您可以始终编辑原始定义。。。
正如您的问题的同一链接答案中所建议的:
<math.h>
负责abs(int)
<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);
}
因此,作为一种实践,在所有源文件中都有一个通用的实用工具头文件是很好的。让它空着吧。
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 导入库可以跨dll版本工作吗
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 在项目的DEBUG和RELEASE版本中,整数的按位操作的行为是不同的
- 如何从三个整数生成constexpr版本的字符串(或者可能是git/SVNcommit/rev.string)
- C++如何防止我的团队开发人员错误地使用整数版本的abs