You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

区分-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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:20:30