如何让gcc警告从uint32_t到uint64_t的转换?

时间:2015-06-16 04:37:37

标签: c++ gcc compiler-warnings

我们采用以下简单示例:

#include <vector>
#include <cstdint>

using ::std::vector;
using ::std::uint64_t;
using ::std::uint32_t;


int main(int argc, char *argv[])
{
    vector<uint64_t> v;

    uint32_t i = 1;

    v.push_back(i);

    return 0;
}

当我用以下代码编译它时:

g++ -std=c++11 -Wall -Wconversion -Wpedantic a.cpp

我没有收到任何转换错误。但是,我希望gcc警告我,因为类型uint64_tuint32_t不完全匹配。我承认uint32_t适合uint64_t,但它仍然有些代码味道给我。 (我希望gcc强迫我施放它)

有没有办法让gcc对此发出警告?

3 个答案:

答案 0 :(得分:2)

转换没有任何问题,因为转换为uint32_t的{​​{1}}不会改变价值:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wconversion-499

uint64_t

#include <iostream> #include <cstdint> int main(int argc, char *argv[]) { std::uint32_t i = 1; std::uint64_t j = 1; // warning: conversion to 'uint32_t {aka unsigned int}' from 'uint64_t {aka long long unsigned int}' may alter its value // i = j; // No problem here j = i; // Use j to avoid an error std::cout << j << std::endl; return 0; } 没有编译器标志,因为它没有任何问题,“气味”只是你的偏好

答案 1 :(得分:0)

uint64_t有64位,uint32_t只有32位。当uint32更改为uint64时,它只会在高32位中添加0,数据不会更改。所以编译器不需要任何警告。但是当uint64_t更改为uint32_t时,编译器会发出警告,因为数据可能会更改。所以你想要的警告无法得到。

答案 2 :(得分:0)

你不能这样做,但是使用C ++ 11 UDL,你可以编写自己的一组类来代替普通的整数,所以你可以提供你想要的任何语义。

整数可能非常痛苦,我只为字符串文字做过。