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

How to have gcc warn about conversions from uint32_t to uint64_t?

让我们举一个简单的例子:

#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 对此发出警告?

该转换没有任何问题,因为将 uint32_t 转换为 uint64_t 不会改变值:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wconversion-499

#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;
}

不会有 j = i; 的编译器标志,因为它没有任何问题,"smell" 只是您的偏好

uint64_t有64位,uint32_t只有32位。当uint32变为uint64时,只在高32位加上0,数据不变。所以编译器不需要任何警告。但是当uint64_t变成uint32_t时,编译器会给出警告,因为数据可能被改变了。所以你想要的警告得不到。

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

对于整数可能会很痛苦,我只对字符串文字做过。