2010-11-02 13 views
5

यदि मैं घोषित करता हूं और चर का उपयोग नहीं करता तो जीसीसी मुझे चेतावनी देगा।अप्रयुक्त सदस्यों को संरचना में कैसे जांचें?

लेकिन मैं कई सदस्यों के साथ एक struct और अगर उन उपयोग नहीं किया जाता, जीसीसी उस बारे में चेतावनी नहीं होगा के कुछ ...

वहाँ एक विकल्प (या किसी अन्य विधि) इन जाँच करने के लिए है?

(बेशक मैं मैन्युअल रूप से कुछ प्रविष्टियों को हटा सकता हूं और फिर संकलित करने का प्रयास कर सकता हूं, लेकिन मैं इस तरह के दृष्टिकोण की तलाश में हूं)।

धन्यवाद

+0

'grep' के बारे में क्या? –

+0

हाँ, मैं सदस्य के नाम के लिए grepping की सिफारिश करेंगे और यह देखकर कि यह एक से अधिक बार आता है। आपको –

+0

हां स्क्रिप्ट करने में सक्षम होना चाहिए, लेकिन कृपया मेरा उत्तर देखें। –

उत्तर

5

कोई जीसीसी इस बारे में चेतावनी नहीं देगा। अधिकांशतः क्योंकि बहुमत के मामले में सदस्य का उपयोग किया जाता है या नहीं, निर्धारित नहीं किया जा सकता है। struct का एक अच्छा हिस्सा हेडर फ़ाइल में परिभाषित किया गया है। इसका उपयोग न केवल आपके आवेदन से किया जा सकता है बल्कि आपके .lib का संदर्भ देने वाले किसी अन्य एप्लिकेशन द्वारा या उसी हेडर फ़ाइल का उपयोग करके किया जा सकता है। इसलिए सिर्फ इसलिए कि संकलित किए जा रहे कोड का वर्तमान टुकड़ा सदस्य का उपयोग नहीं करता है, इसका मतलब यह नहीं है कि सदस्य कोड के किसी अन्य भाग द्वारा उपयोग नहीं किया जाता है।

स्थानीय चर अलग-अलग हैं। प्रश्न में केवल फ़ंक्शन को संकलित करके आसानी से निर्धारित किया जाता है या नहीं। इसलिए जीसीसी, और कई अन्य कंपाइलर, एक चेतावनी देते हैं।

+1

संरचना में पैडिंग और संरेखण के लिए इसमें सदस्य भी हो सकते हैं; आप शायद इनके बारे में जीसीसी चेतावनी नहीं चाहते हैं। –

3

आप कानूनी रूप से और पोर्टेबल अपने नाम का उपयोग किए बिना संरचना के पहले सदस्य तक पहुंच सकते हैं, बस पहले सदस्य के प्रकार के लिए संरचना कास्टिंग करके।

typedef struct { 
    int x; 
} mystruct; 

mystruct s; 
*(int*)&s = 3; 

तुम भी गैर portably सकते हैं, लेकिन वास्तव में 100% विश्वसनीयता के साथ, एक संगत संरचना के साथ एक और struct प्रकार के struct कास्टिंग द्वारा जैसा कि इसके नाम का उपयोग किए बिना struct में किसी भी क्षेत्र का उपयोग।

typedef struct { 
    int x; 
    char y; 
} mystruct; 

typedef struct { 
    int a; 
    char b; 
} otherstruct; 

mystruct s; 
((otherstruct*)&s)->b = 'C'; 

मुझे डर है कि इसका मतलब है कि कि न तो खोज क्षेत्र के नाम के लिए स्रोत है, और न ही इसे हटाने हूँ, पूरी तरह से विश्वसनीय हैं।

+1

आप मानक 'ऑफसेट() 'मैक्रो का भी उपयोग कर सकते हैं, जो आपको कानूनी रूप से और पोर्टेबल रूप से आपके दूसरे उदाहरण की तरह कुछ करने की अनुमति देगा। –

+0

यह काफी सही है, हालांकि जब आप स्रोत कोड खोजते हैं तो आपको कम से कम यह पता चल जाएगा। –

+0

+1 यह एक अच्छा दृष्टिकोण है। –

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