2015-06-16 123 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,你可以編寫自己的一組類來代替正常的整數,所以你可以提供任何你想要的語義。

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