2012-04-17 24 views
7

-Wconversion चेतावनियां उत्पन्न कर रहा है जब मैं g ++ के साथ थोड़ा सा फ़ील्ड मान देता हूं।सी ++ बिट फ़ील्ड और -वॉन्वर्जन

स्रोत फ़ाइल:

struct Foo 
{ 
public: 
    unsigned int x : 4; 
    unsigned int y : 9; 
    unsigned int z : 17; 
}; 

int main(int, char**) 
{ 
    int a = 12; 
    Foo f; 
    f.x = a; 
    f.x = (unsigned int)a; 
    f.x = (unsigned char)a; 
    f.x = (unsigned short)a; 
    f.x = (unsigned)a; 

    f.y = a; 
    f.y = (unsigned int)a; 
    f.y = (unsigned char)a; // no warning, sizeof(char) < 9 
    f.y = (unsigned short)a; 
    f.y = (unsigned)a; 

    f.z = a; 
    f.z = (unsigned int)a; 
    f.z = (unsigned char)a; // no warning, sizeof(char) < 17 
    f.z = (unsigned short)a; // no warning, sizeof(char) < 17 
    f.z = (unsigned)a; 
} 

संकलन उत्पादन:

$ g++ --version 
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 
<snip> 
$ g++ -Wconversion test.cpp 
test.cpp: In function ‘int main(int, char**)’: 
test.cpp:13:8: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion] 
test.cpp:14:22: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion] 
test.cpp:15:23: warning: conversion to ‘unsigned char:4’ from ‘unsigned char’ may alter its value [-Wconversion] 
test.cpp:16:24: warning: conversion to ‘unsigned char:4’ from ‘short unsigned int’ may alter its value [-Wconversion] 
test.cpp:17:18: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion] 
test.cpp:19:8: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion] 
test.cpp:20:22: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion] 
test.cpp:22:24: warning: conversion to ‘short unsigned int:9’ from ‘short unsigned int’ may alter its value [-Wconversion] 
test.cpp:23:18: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion] 
test.cpp:25:8: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion] 
test.cpp:26:22: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion] 
test.cpp:29:18: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion] 

मैं -Wconversion (इस फ़ाइल के भीतर भी) अपने प्रोजेक्ट के अन्य भागों के लिए सक्षम करना चाहते हैं। मैं यहां असाइनमेंट कथन कैसे "ठीक" करूं ताकि मुझे चेतावनियां न मिलें?

+0

यदि आप 'int' बंद करते हैं तो क्या होता है? –

+0

@ 0A0D अपडेट देखें। – robert

उत्तर

11

सुनिश्चित करें कि रूपांतरण ओवरफ़्लो नहीं हो सकता है। यहाँ एक तरीका है:

struct Foo 
{ 
public: 
    unsigned int x : 4; 
    unsigned int y : 9; 
    unsigned int z : 17; 
}; 

int main(int, char**) 
{ 
    int a = 12; 
    Foo f; 
    f.x = static_cast<unsigned int>(a & 15);  
    f.y = static_cast<unsigned int>(a & 511); 
    f.z = static_cast<unsigned int>(a & 131071); 
} 
+0

यह काम करता है। धन्यवाद। – robert

-1

Wconversion हर बार चेतावनी दे देंगे वहाँ एक संभवतः है कि आपके अंतर्निहित रूपांतरण अपने मूल्य बदल सकता है। कहा गया है, आपके कोड में कोई समस्या नहीं है।

static_cast<usigned_int> का उपयोग करके ऊपर उल्लेखित किया गया है, यह आपकी समस्या को ठीक करेगा।

Some more information