![](/img/trans.png)
[英]How to assign min of uint32_t::max and uint64_t in type safe manner?
[英]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_t
和uint32_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.