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及更高版本中工作正常. <source>: In function 'int main()': <source>:7:23: error: switch quantity not an integer 所以我的问题是为什么GCC引入了这个突破性的变化? 或者,实施者是否意识到这是一个重大改变?如果是这样,为什么他们如何测试他们不破坏现有代码? 这个问题也可以针对Clang,因为它与abs函数有类似的问题. 解决方法
GCC(和clang)库(分别为glibc和libc)破坏了向后兼容性以符合C标准.
麻烦是由这个条款造成的:
short int是“整数类型”,因此bullet#2启动并导致生成一个调用double abs(double)的包装器,这个包装器比int abs(int)更好. 值得注意的是,标准的最新草案在此规则中添加了明确的例外:
此异常实际上源自handling of unsigned types,但也解决了您的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |