区分-Wnarrowing与-Wconversion:如何仅检测不可逆窄化数据丢失?
窄化转换警告的精准控制问题
以下代码中存在明确的窄化转换,会导致数据丢失:
#include <memory> #include <iostream> #include <math.h> void f1(int32_t i) { std::cout << i << "\n"; } int64_t f2() { return -1; } int main([[maybe_unused]] int a1, [[maybe_unused]] char ** a2) { int i; uint64_t ll = pow(2, 49); i = ll; std::cout << ll << "\n"; std::cout << i << "\n"; f1(ll); i = f2(); }
但使用编译命令 g++ -Wall -Wextra -Wnarrowing narrowing.cc 时,没有收到任何警告。添加 -Wconversion 参数后,才触发了多条转换警告:
narrowing.cc: In function 'int main(int, char**)': narrowing.cc:16:8: warning: conversion from 'uint64_t' {aka 'long unsigned int'} to 'int' may change value [-Wconversion] 16 | i = ll; | ^~ narrowing.cc:20:7: warning: conversion from 'uint64_t' {aka 'long unsigned int'} to 'int32_t' {aka 'int'} may change value [-Wconversion] 20 | f1(ll); | ^~ narrowing.cc:21:10: warning: conversion from 'int64_t' {aka 'long int'} to 'int' may change value [-Wconversion] 21 | i = f2(); | ~~^~
问题在于 -Wconversion 过于敏感,它会对所有可能改变值的转换发出警告,哪怕实际场景中不会真的发生数据丢失。我需要的是仅针对实际发生不可逆窄化、确实造成数据丢失的情况发出警告,而非所有潜在的转换风险。
内容的提问来源于stack exchange,提问作者MK.
相关产品推荐
相关产品推荐

