如何让 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_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;
的编译器标志,因为它没有任何问题,"smell" 只是您的偏好
uint64_t
有64位,uint32_t
只有32位。当uint32
变为uint64
时,只在高32位加上0
,数据不变。所以编译器不需要任何警告。但是当uint64_t
变成uint32_t
时,编译器会给出警告,因为数据可能被改变了。所以你想要的警告得不到。
你不能这样做,但使用 C++11 UDL,你可以编写自己的 类 集来代替普通整数,这样你就可以提供你想要的任何语义。
对于整数可能会很痛苦,我只对字符串文字做过。
让我们举一个简单的例子:
#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;
的编译器标志,因为它没有任何问题,"smell" 只是您的偏好
uint64_t
有64位,uint32_t
只有32位。当uint32
变为uint64
时,只在高32位加上0
,数据不变。所以编译器不需要任何警告。但是当uint64_t
变成uint32_t
时,编译器会给出警告,因为数据可能被改变了。所以你想要的警告得不到。
你不能这样做,但使用 C++11 UDL,你可以编写自己的 类 集来代替普通整数,这样你就可以提供你想要的任何语义。
对于整数可能会很痛苦,我只对字符串文字做过。