2011-10-13 12 views
24

यह चेतावनी क्यों है? मुझे लगता है कि ऐसे कई मामले हैं जब "कोई मतलब नहीं" संख्याओं के बजाय बहु-चर int स्थिरांक का उपयोग करने के लिए और समान मूल्य वाले कॉन्स्ट चर को परिभाषित करने के बजाय अधिक स्पष्ट है। जब वेव/टिफ़/अन्य फ़ाइल प्रकारों को पार्सिंग करते हैं तो उनके मूल्यों के बजाय कुछ 'EVAW', 'डेटा' आदि के साथ पढ़ने वाले मानों की तुलना करने के लिए अधिक स्पष्ट होता है।मल्टी-कैरेक्टर निरंतर चेतावनियां

नमूना कोड:

int waveHeader = 'EVAW'; 

क्यों इस एक चेतावनी देता है?

+0

मुझे आपके प्रश्न को समझने में समस्या आ रही है। क्या आप इसे स्पष्ट कर सकते हैं? –

+0

@ 0 ए0 डी मैं कोशिश करूंगा :) क्षमा करें – Felics

+0

संबंधित: http: // stackoverflow।कॉम/प्रश्न/74 9 71 9 2/एनम-कॉन्स्टेंट-प्रश्न –

उत्तर

28

According to the standard (§6.4.4.4/10)

एक पूर्णांक चरित्र एक से अधिक चरित्र युक्त निरंतर का मूल्य (जैसे 'अब'), [...] कार्यान्वयन परिभाषित किया गया है।

long x = '\xde\xad\xbe\xef'; // yes, single quotes 

यह मान्य ISO 9899 है: 2011 सी यह -Wall साथ gcc के तहत बिना किसी चेतावनी के संकलित, और एक "बहु चरित्र चरित्र निरंतर" -pedantic साथ चेतावनी।

Wikipedia से

:

मल्टी चरित्र स्थिरांक (जैसे 'xy') मान्य हैं, हालांकि शायद ही कभी उपयोगी - वे करते हैं एक दुकान एक पूर्णांक में कई पात्रों (जैसे 4 ASCII वर्ण एक में फिट कर सकते हैं 32-बिट पूर्णांक, 64-बिट एक में 8)। चूंकि वर्ण एक int में पैक किए गए क्रम से निर्दिष्ट नहीं है, बहु-चरित्र स्थिरांक का पोर्टेबल उपयोग मुश्किल है।

पोर्टेबिलिटी के लिए, अभिन्न प्रकार के साथ बहु-चरित्र स्थिरांक का उपयोग नहीं करते।

+3

मुझे यकीन नहीं है कि आखिरी वाक्यांश का क्या अर्थ है; बहु-चरित्र स्थिरांक में हमेशा अभिन्न प्रकार होते हैं (और उपसर्ग के बिना ऐसे स्थिरांक हमेशा टाइप 'int' होते हैं)। –

12

यह चेतावनी प्रोग्रामर के लिए उपयोगी है जो गलती से 'test' लिखती हैं जहां उन्हें "test" लिखा जाना चाहिए था।

यह प्रोग्रामर से अधिक बार होता है जो वास्तव में बहु-चार int स्थिरांक चाहते हैं।

+2

यह एक अच्छा उदाहरण है, लेकिन जब मैं वास्तव में 'टेस्ट' लिखना चाहता हूं और मुझे चेतावनी है तो क्या होता है। मैं अपने कोड में कोई चेतावनी नहीं देता ... – Felics

+0

आपको चेतावनी का सामना करना पड़ेगा, या इस विशिष्ट चेतावनी को अक्षम करने के लिए अपने कंपाइलर विकल्प को ढूंढना होगा (जो आपको आपके कोड में किसी अन्य स्थान पर चोट पहुंचा सकता है ;-))। –

+1

एक और आकस्मिक प्रोग्रामर त्रुटि हेक्स से बचने के लिए वाक्यविन्यास को गलत तरीके से याद करना और '\ 0x61' लिखना है जब कोई '\ x61' था। – tml

11

आप खुश हैं, तो आप जानते हैं कि आप क्या कर रहे हैं और उदाहरण के लिए जीसीसी पर पोर्टेबिलिटी समस्याओं स्वीकार कर सकते हैं, तो आप कमांड लाइन पर चेतावनी निष्क्रिय कर सकते हैं:

-Wno-multichar 

मैं अपने खुद के लिए इसका उपयोग आपके लिए समान कारणों से एवीआई और एमपी 4 फ़ाइल हेडर के साथ काम करने के लिए ऐप्स।

3

भले ही आप को देखने के लिए क्या व्यवहार अपने कार्यान्वयन को परिभाषित करता है को तैयार हैं, बहु चरित्र स्थिरांक अभी भी endianness साथ अलग अलग होंगे।

एक (पीओडी) संरचना {char [4]} का उपयोग करने के लिए बेहतर; ... और उसके बाद उस श्रेणी के उदाहरणों को आसानी से बनाने के लिए "WAVE" _4cc जैसे UDL का उपयोग करें

संबंधित मुद्दे