我们采用以下简单示例:
#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对此发出警告?
答案 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,你可以编写自己的一组类来代替普通的整数,所以你可以提供你想要的任何语义。
整数可能非常痛苦,我只为字符串文字做过。