繁体   English   中英

如何让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;不会有编译器标志j = i; 因为没有问题,“气味”只是您的偏好

uint64_t只有64位, uint32_t只有32位。 uint32更改为uint64 ,仅在高32位中加0 ,数据保持不变。 因此,编译器不需要任何警告。 但是,当uint64_t更改为uint32_t ,编译器会发出警告,因为可能会更改数据。 因此无法获得您想要的警告。

您无法做到这一点,但是使用C ++ 11 UDL可以编写自己的要使用的类集,而不是普通的整数,因此您可以提供所需的任何语义。

对于整数来说,这可能会很痛苦,我只对字符串文字使用了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM