为何GCC未对float隐式转换为double调用isnan()发出警告?
为什么调用isnan(float)没触发-Wdouble-promotion警告?
- C语言没有函数重载机制,<math.h>里的
isnan并不是同时声明了isnan(double)和isnanf(float)两个独立函数,而是通过宏实现的类型适配逻辑。 - 当你传入
float类型的参数x时,预处理器会自动把isnan(x)展开为对应float类型的检查实现(比如isnanf(x)),完全不会发生float到double的隐式转换。 - GCC的
-Wdouble-promotion警告只针对隐式将float转为double的场景(比如给只接受double的函数传float参数),但这里实际调用的是适配float的版本,没有转换行为,所以不会触发警告。
你可以用gcc -E命令查看预处理后的代码,能清楚看到isnan(x)被替换成了针对float的检查宏,而非调用double版本的函数。
内容的提问来源于stack exchange,提问作者Paul Grinberg
相关产品推荐
相关产品推荐

