2015-06-16 2 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_t и uint32_t не идеально подходят. Я полагаю, что uint32_t вписывается в uint64_t, но мне все еще не хватает запаха кода. (Я хотел бы, чтобы gcc заставил меня его лить)

Есть ли способ, чтобы gcc предупредил об этом?

+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, он добавит только 0 в высоких 32 битах, данные не изменяются. Поэтому для компилятора не требуется никаких предупреждений. Но когда uint64_t изменится на uint32_t, компилятор даст предупреждение, потому что данные могут быть изменены. Значит, предупреждение, которое вы хотите, не получилось.

0

Вы не можете этого сделать, но с UDL C++ 11 вы можете написать собственный набор классов, которые будут использоваться вместо обычных целых чисел, поэтому вы можете предоставить любую семантику, которую хотите.

Это, вероятно, довольно болезненно для целых чисел, я только сделал это для строковых литералов.

Смежные вопросы