2015-06-16 75 views
0

让我们采取以下简单的例子:如何让gcc警告关于从uint32_t到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,但它仍然有一些代码味道给我。 (我想海湾合作委员会强迫我施放它)

有没有办法让海湾合作委员会警告呢?

+6

'uint32_t'可以在没有任何数据丢失的情况下转换为'uint64_t' - 为什么编译器会提醒你? –

+0

因为它有味道。这是一个隐含的转换。 –

+4

'uint32_t i = 1;'也是一种隐式转换。 C++一直在做。除非有数据丢失的可能性,否则没有任何问题。 –

回答

2

没有什么不对的转换,是因为一个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;一个编译器标志,因为没有什么错它的“气味”只是你的偏好

0

uint64_t有64位,uint32_t只有32位。当uint32更改为uint64时,它只在高32位中添加0,数据不变。所以编译器不需要任何警告。但是当uint64_t更改为uint32_t时,编译器会发出警告,因为数据可能会更改。所以你想要的警告无法得到。

0

你不能这样做,但对于C++ 11 UDL,你可以编写自己的一组类来代替正常的整数,所以你可以提供任何你想要的语义。

整数可能相当痛苦,我只做了字符串文字。