gpt4 book ai didi

c++ - 针对 C++ 隐式转换的警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:39 26 4
gpt4 key购买 nike

我有这个 C++ 代码:

#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

int main() {
vector<int64_t> vec = {4294967296, 4294967296, 4294967296};
int64_t sum = accumulate(vec.begin(), vec.end(), 0, [](int64_t sum, int64_t val){
return sum + val;
});
cout << "sum = " << sum << endl;
}

它返回 sum = 0 因为从 intint64 的隐式转换(参见 0 作为第三个参数accumulate 函数)。将 0 替换为 (int64_t)0 后一切正常。

但是我可以在编译时检测到这些东西吗? -Wconversion 在这种情况下不起作用。

最佳答案

如果 std::accumulate 的代码不在系统头文件中,您将收到警告:

int init=0;
init += *vec.begin() //warning: conversion from 'int64_t' {aka 'long int'} to 'int' may change value [-Wconversion]

但是系统头文件的许多警告被禁用,因为这样的警告会导致许多嘈杂和不相关的消息。

此行为可以重现。假设您有此文件 test.hpp:

int64_t i;
int j = i;

如果在包含此文件的同一目录中编译文件 test.cpp:

  • 使用 c++ -I 。 test.cpp -Wconversion,打印警告信息;
  • 使用 c++ -isystem 。 test.cpp -Wconversion 警告消息 未打印!

这正是标准库的头文件所发生的情况,默认情况下,包含目录是用 -isystem 指定的。

可以使用选项 -Wsystem-header 禁用系统 header 警告消息抑制

Demo

并且在Demo中可以看到,警告信息隐藏在一堆或不相关的警告信息中。

关于c++ - 针对 C++ 隐式转换的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53690788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com