2012-04-25 7 views
6

जो मैं करने की कोशिश कर रहा हूं वह सभी स्पष्ट फाइलों को दो स्रोतों से ढूंढता है या मेरे पास कुछ स्रोत फ़ाइलों में किसी अन्य प्रकार के लिए तैरता है। क्या ऐसा करने के लिए एक अंतर्निहित जीसीसी तरीका है? भाषा सी है धन्यवाद!क्या स्पष्ट कस्टों पर चेतावनी देने के लिए जीसीसी या क्लैंग प्राप्त करने का कोई तरीका है?

+2

शायद मैं सिर्फ सरल किया जा रहा हूँ, लेकिन तुम सिर्फ '(डबल के लिए खोज नहीं कर सका) 'या' (फ्लोट) 'आपके स्रोत में? –

+0

@RobertHarvey क्षमा करें, मैंने इसे और अधिक समझने के लिए दोहराया। मैं सभी स्पष्ट जानवरों को पकड़ना चाहता हूं जो कि फ्लोट/डबल से कुछ और हैं, इसलिए मैं (int), आदि के लिए खोज कर सकता हूं .. लेकिन मैं यह बताने में सक्षम नहीं हूं कि वे फ्लोट या डबल हैं या नहीं। – Chris

+1

बस एक विचार (मुझे सी ++ नहीं पता है या यदि यह भी संभव है): संकलन विफलता को उत्सर्जित करने और सी ++ के रूप में संकलित करने के लिए कास्ट ऑपरेटर को डबल और फ्लोट के लिए ओवरराइड करें :) – pmg

उत्तर

2

के बाद से डाले स्पष्ट रूप से कानूनी है, और सही तरीके से अजीब रूपांतरण प्रदर्शन करने के लिए हैं, यह अत्यधिक संभावना नहीं है कि जीसीसी पर कैसे बड़ा स्रोत है निर्भर करता है, उनके बारे में चेतावनी देने के लिए

इसके बजाय एक विकल्प होते हैं, तो आप में सक्षम हो सकता इससे दूर जाने के लिए:

grep '\(double|float\) ' * 

आपको सभी डबल या फ्लोट चर देने के लिए। चूंकि सी नियमित भाषा नहीं है, इसलिए यह डबल या फ्लोट चर की सूची में इसे पार्स करने के लिए छोटा नहीं है (लेकिन खोल उपकरण के साथ), लेकिन यदि आपका स्रोत पर्याप्त छोटा है, तो हाथ से ऐसा करना आसान है।

grep '([^()]*)[()]*\(your list of variable names\)' * 

वहां से आप अपने कई जानवरों को दिखाएंगे।

2

-Wconversion अंतर्निहित रूपांतरण है कि एक मूल्य (double बड़े प्रकार के होते हैं), और हस्ताक्षर किए और अहस्ताक्षरित पूर्णांकों के बीच रूपांतरण के बारे में -Wno-sign-conversion अक्षम चेतावनी को बदल सकता है के लिए चेतावनी दी है (इसलिए कम अनावश्यक चेतावनी होगा)। वरना मैं किसी भी मानक विकल्प नहीं दिख रहा है ...

सबसे खराब मामला आप सीधे अपने स्रोत फ़ाइलों में उन खोजशब्दों की तलाश कर सकते हैं ...

+1

जो मैं समझता हूं, स्पष्ट रूपांतरणों को पकड़ा नहीं जाएगा - वास्तव में वे चेतावनियों से छुटकारा पाने का एक तरीका हैं। मैंने कुछ परीक्षण किए और यह भी सच साबित हुआ, इसलिए मुझे ऐसा करने का कोई और तरीका ढूंढना होगा। – Chris

+0

अनजाने में, वे दिखाए जाते हैं (कम से कम तब जब मैंने कुछ महीने पहले कोशिश की थी)। मैंने _ -Wconversion' को _accidential_ रूपांतरणों को पकड़ने के लिए सक्षम किया था, और स्पष्ट (और इच्छित) रूपांतरणों से उत्पन्न शोर की मात्रा असहनीय थी। – Damon

0

खैर मुझे लगता है कि इस तरह का कोई विकल्प नहीं है। आखिरकार, उन चीजों से आपको चेतावनी देने के लिए संकलक द्वारा एक चेतावनी जारी की जाती है जो आपने अनजाने में किया हो। एक स्पष्ट कलाकार, हालांकि, मूल रूप से आपके कंपाइलर को बताने का एक तरीका है "चुप रहो, मुझे पता है कि मैं क्या कर रहा हूं"।

+0

यह फ्लोट या डबल्स नहीं है कि मैं चिंतित हूं, यह फ्लोट से है और किसी और चीज से दोगुना है। मैंने सभी जानवरों के लिए एक सूची बनाई है, लेकिन मुझे उस सूची से वेरिएबल नाम निकालने की ज़रूरत है जो केवल फ्लोट या युगल हैं, जिन्हें मुझे करना बहुत मुश्किल लगता है। – Chris

+0

किस प्रकार का कास्ट यहां समस्याग्रस्त है? यदि वे समस्याग्रस्त हैं, तो वे कोड में पहली जगह क्यों पहुंचे? –

+1

@cli_hlt: खराब कोड मौजूद है, आपको पता है, जिसे बेहतर करने के लिए तय किया जाना चाहिए :) –

6

यदि आपका सी कोड भी सी ++ मोड में संकलित किया जा सकता है, तो आप ऐसे सभी जानवरों पर चेतावनी ट्रिगर करने के लिए g ++ के -Wold-style-cast चेतावनी ध्वज का उपयोग कर सकते हैं।

आप यह निर्धारित कर सकते हैं कि क्लैंग की कोई चेतावनी है जो -Weverything स्विच का उपयोग कर एक विशेष कोडिंग पैटर्न के लिए ट्रिगर करेगी (लेकिन ध्यान दें कि यह लगभग किसी अन्य उद्देश्य के लिए उपयोगी नहीं है - क्लैंग में अक्षम-द्वारा-डिफ़ॉल्ट चेतावनियां हैं जो ट्रिगर करती हैं वैध कोड के विभिन्न रूपों पर)। हालांकि, इस मामले में, क्लैंग में ऐसी कोई चेतावनी नहीं है जो इस तरह के जानवरों पर ट्रिगर करती है।

0

compilers मुझे पता है कि के लिए विकल्प नहीं है, वहीं गिम्पेल के FlexeLint आप क्या चाहते हैं कर सकते हैं:

$ cat tst.c 
int main (void) 
{ 
    int i = 0, j = 0; 
    float f = 0.0; 
    double d = 0.0; 

    i = (int) f; 
    j = (int) d; 
    d = (double) f; 
    f = (float) d; 
    i = (int)j; 
    j = (unsigned) i; 
    return (int) j; 
} 

$ flexelint -w1 +e922 tst.c 
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012 

--- Module: tst.c (C) 
       _ 
    i = (int) f; 
tst.c 7 Note 922: cast from float to int 
       _ 
    j = (int) d; 
tst.c 8 Note 922: cast from double to int 
        _ 
    d = (double) f; 
tst.c 9 Note 922: cast from float to double 
       _ 
    f = (float) d; 
tst.c 10 Note 922: cast from double to float 

shell returned 4