防止在C中从float到double的隐式转换

基本上,如果我想要这样的东西,
double b = sin(2.2);

但不小心写了这样的东西,

double b = sin(2.2f);

没有错误甚至是警告信息,即使这显然会导致不同的,不准确的,因此不正确的结果.通过强制编译器不执行float到double的任何隐式转换,可以防止这种类型的错误.有没有办法实现这一点,无论是通过编译开关(最好是在Visual Studio中),一些智能宏,还是一个行为像float / double变量并声明自己的运算符的类?

编辑:我也有兴趣使用运算符解决类似的问题(例如双b = 2.2f * 2.2f)或赋值(double b = 2.2f).

解决方法

您可以使用type_assert实用程序.

例:

#include <cmath>
#include <type_traits>

template<typename T,typename U>
const U& type_assert(const U& u) {
    static_assert(std::is_same<T,U>::value,"...");
    return u;
}

int main() {
    double t = type_assert<double>(std::sin(2.2f));
}

如果预期的类型不同,那么它会给你一个编译器错误.如果它通过,编译器可能会优化它,至少在我的情况下使用-O3.

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...