c – 为什么GCC会破坏用短参数调用abs函数的代码?

前端之家收集整理的这篇文章主要介绍了c – 为什么GCC会破坏用短参数调用abs函数的代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <cmath>
#include <cstdlib>

int main()
{
    short int k = 11;
    switch(std::abs(k)) {
        case 44:
            return 5;
            break;
    }
}

上面的代码在GCC 4.4.7和7.1及更高版本中工作正常.
它在GCC 4.5.4及更高版本中出错:

<source>: In function 'int main()':
<source>:7:23: error: switch quantity not an integer

所以我的问题是为什么GCC引入了这个突破性的变化?

或者,实施者是否意识到这是一个重大改变?如果是这样,为什么他们如何测试他们不破坏现有代码

这个问题也可以针对Clang,因为它与abs函数有类似的问题.

解决方法

GCC(和clang)库(分别为glibc和libc)破坏了向后兼容性以符合C标准.

麻烦是由这个条款造成的:

Moreover,there shall be additional overloads suffcient to ensure:

    @H_301_25@

    If any arithmetic argument corresponding to a double parameter has type long double,then all arithmetic arguments corresponding to
    double parameters are effectively cast to long double.

    @H_301_25@

    Otherwise,if any arithmetic argument corresponding to a double parameter has type double or an integer type,then all arithmetic
    arguments corresponding to double parameters are effectively cast to
    double.

    @H_301_25@

    Otherwise,all arithmetic arguments corresponding to double parameters have type float.

short int是“整数类型”,因此bullet#2启动并导致生成一个调用double abs(double)的包装器,这个包装器比int abs(int)更好.

值得注意的是,标准的最新草案在此规则中添加了明确的例外:

For each set of overloaded functions within,with the exception of abs,there shall be additional overloads suffcient to ensure:

此异常实际上源自handling of unsigned types,但也解决了您的问题.

猜你在找的C&C++相关文章