सी के लिए उपयोगी जीसीसी झंडे


157

सेटिंग से परे -Wall, और सेटिंग -std=XXX, क्या वास्तव में उपयोगी है, लेकिन कम ज्ञात संकलक झंडे सी में उपयोग के लिए हैं?

मैं विशेष रूप से किसी भी अतिरिक्त चेतावनियों में दिलचस्पी रखता हूं, और / या कुछ मामलों में त्रुटियों में चेतावनी बदलकर किसी भी आकस्मिक प्रकार के बेमेल को कम से कम करने के लिए।


9
खैर -save-temps, -Wshadowऔर -fmudflapसबसे बड़े थे जो मुझे पता नहीं था, सभी के लिए धन्यवाद।
मैट जॉइनर

संदर्भ, जहां तक ​​मैं बता सकता हूं: gcc -c [flags-go-here] -o myprog.o myprog.cएक सी प्रोग्राम को संकलित करने के लिए (लिंक नहीं) चल रहा है।
रोरी ओ'केन

जवाबों:


64

-fकोड पीढ़ी के कई विकल्प दिलचस्प हैं:

  • -ftrapvसमारोह कार्यक्रम पर हस्ताक्षर किए पूर्णांक अतिप्रवाह (औपचारिक रूप से "अपरिभाषित व्यवहार 'सी में) पर निरस्त करने के लिए कारण होगा।

  • -fverbose-asmउपयोगी है अगर आप -Sअसेंबली आउटपुट की जांच करने के लिए संकलन कर रहे हैं - यह कुछ जानकारीपूर्ण टिप्पणियां जोड़ता है।

  • -finstrument-functions प्रत्येक फ़ंक्शन प्रविष्टि और निकास बिंदु पर उपयोगकर्ता द्वारा आपूर्ति की गई प्रोफाइलिंग फ़ंक्शन को कॉल करने के लिए कोड जोड़ता है।


इसके लिए -ftrapv, यहाँ एक नज़र रखना है stackoverflow.com/questions/20851061/… .. ऐसा लगता है जैसे एक बग लंबा होने का इंतज़ार है।
अर्जुन श्रीधरन

क्या आप उपरोक्त टिप्पणी की जांच कर सकते हैं?
सूरज जैन

-ftrapv अनिवार्य रूप से =-हस्ताक्षरित-पूर्णांक-ओवरफ़्लो द्वारा सुपर-डाउन किया गया था।
मार्क ग्लिससे

139

यहाँ मेरा हैं:

  • -Wextra, -Wall: आवश्यक।
  • -Wfloat-equal: उपयोगी है क्योंकि आमतौर पर समानता के लिए फ्लोटिंग-पॉइंट नंबरों का परीक्षण करना बुरा है।
  • -Wundef: अगर एक #ifनिर्देश में एक अनधिकृत पहचानकर्ता का मूल्यांकन किया जाता है तो चेतावनी दें ।
  • -Wshadow: जब भी एक स्थानीय चर दूसरे स्थानीय चर, पैरामीटर या वैश्विक चर या जब भी एक अंतर्निहित फ़ंक्शन छाया होता है, तो चेतावनी दें।
  • -Wpointer-arith: चेतावनी दी है अगर कुछ भी एक समारोह या के आकार पर निर्भर करता है void
  • -Wcast-align: जब भी कोई पॉइंटर ऐसा डाला जाता है तो चेतावनी दें कि लक्ष्य का आवश्यक संरेखण बढ़ जाए। उदाहरण के लिए, यदि कोई char *ऐसी int *मशीनों पर डाली जाती है जहां पूर्णांक केवल दो या चार-बाइट सीमाओं पर पहुँचा जा सकता है , तो चेतावनी दें ।
  • -Wstrict-prototypes: यदि कोई फ़ंक्शन घोषित किया गया है या तर्क प्रकारों को निर्दिष्ट किए बिना परिभाषित किया गया है, तो चेतावनी दें।
  • -Wstrict-overflow=5: उन मामलों के बारे में चेतावनी देता है जहां संकलक इस धारणा के आधार पर अनुकूलन करता है कि हस्ताक्षरित अतिप्रवाह नहीं होता है। (मान 5 बहुत सख्त हो सकता है, मैनुअल पेज देखें।)
  • -Wwrite-strings: स्ट्रिंग स्थिरांक प्रकार const char[लंबाई दे] ताकि एक के पते को गैर- const char *पॉइंटर में कॉपी करने पर चेतावनी मिल सके।
  • -Waggregate-return: यदि संरचना या यूनियनों को लौटाने वाले किसी भी कार्य को परिभाषित या पुकारा जाता है।
  • -Wcast-qual: चेतावनी दें जब भी कोई टारगेट टाइप * से एक क्वॉलिफायर हटाने के लिए पॉइंटर डाला जाता है
  • -Wswitch-default: चेतावनी दें जब भी एक switchबयान में defaultमामला न हो *
  • -Wswitch-enum: चेतावनी दें कि जब भी किसी switchकथन में प्रगणित प्रकार का सूचकांक होता है और caseउस ड्यूमेड * के नामित कोड के एक या अधिक के लिए कमी होती है
  • -Wconversion: निहितार्थ रूपांतरणों के लिए चेतावनी जो मूल्य में परिवर्तन कर सकते हैं *
  • -Wunreachable-code: यदि चेतावनी है कि संकलक पता लगाता है कि कोड कभी भी निष्पादित नहीं किया जाएगा *

जो चिह्नित हैं * कभी-कभी बहुत अधिक सतर्क चेतावनी देते हैं, इसलिए मैं उन्हें आवश्यकतानुसार उपयोग करता हूं।


11
सुंदर पूरी सूची, बस एक और जोड़ना चाहते हैं; -Wformat=2: प्रिंटफ़ / स्कैनफ़ फ़ंक्शंस पर अतिरिक्त प्रारूप की जाँच।
विद्वत अंक

1
इन सभी द्वारा निहित हैं -Wall?
chacham15

2
@ chacham15, नहीं, मुझे ऐसा नहीं लगता। gcc.gnu.org/onbuildocs/gcc/Warning-Options.html
आलोक सिंघल

1
@ आलोक हम्म, शायद वितरण के बीच इसका मानक नहीं है? मुझे पता है कि मेरे mbp पर मुझे स्पष्ट रूप से बंद करना होगा -Wwrite-stringsक्योंकि मैं इससे बहुत नफरत करता हूं।
चाचम 15

@ chacham15, शायद। लेकिन -Wwrite-stringsविशेष रूप से वर्णन के लिए यह इसका हिस्सा नहीं है -Wall: gcc.gnu.org/oniltocs/gcc/… । शायद आपके सेटअप में कुछ और उस झंडे को सेट कर रहा है? या शायद आप C ++ का संकलन कर रहे हैं?
आलोक सिंघल

52

हमेशा का उपयोग करें -Oऊपर या ( -O1, -O2,-Os , आदि)। डिफ़ॉल्ट ऑप्टिमाइज़ेशन स्तर पर, gcc संकलन की गति के लिए जाता है और यह इकाईगत चर जैसी चीजों के बारे में चेतावनी देने के लिए पर्याप्त विश्लेषण नहीं करता है।

बनाने पर विचार करें -Werrorनीति , क्योंकि चेतावनी जो संकलन को रोकती नहीं है उसे नजरअंदाज किया जाता है।

-Wall बहुत अधिक चेतावनियाँ हैं जो त्रुटियों की संभावना हैं।

चेतावनियों में शामिल -Wextra सामान्य, वैध कोड को ध्वजांकित करने की प्रवृत्ति हैं। वे कोड समीक्षाओं के लिए उपयोगी हो सकते हैं (हालांकि लिंट-शैली के कार्यक्रम बहुत अधिक लचीले होते हैं) अधिक सामान्य होते हैं, लेकिन मैं उन्हें सामान्य विकास के लिए चालू नहीं करूंगा।

-Wfloat-equal एक अच्छा विचार है अगर परियोजना पर डेवलपर्स फ्लोटिंग पॉइंट से अपरिचित हैं, और यदि वे हैं तो एक बुरा विचार।

-Winit-selfउपयोगी है; मुझे आश्चर्य है कि इसमें शामिल क्यों नहीं है-Wuninitialized

-Wpointer-arithयदि आपके पास ज्यादातर पोर्टेबल कोड है जो आपके साथ काम नहीं करता है तो उपयोगी है -pedantic


9
+1 के लिए "-Wloloat-बराबर एक अच्छा विचार है यदि प्रोजेक्ट पर डेवलपर्स फ्लोटिंग पॉइंट से अपरिचित हैं, और यदि वे हैं तो एक बुरा विचार।" विशेष रूप से इसका दूसरा भाग। :-)
आर .. गिटहब स्टॉप हेल्पिंग आईसीई

39
-save-temps

यह प्रीप्रोसेसर और असेंबली के परिणामों को पीछे छोड़ देता है।

प्रीप्रोसेस स्रोत मैक्रोज़ डीबग करने के लिए उपयोगी है।

विधानसभा यह निर्धारित करने के लिए उपयोगी है कि कौन से अनुकूलन प्रभाव में आए। उदाहरण के लिए, आप यह सत्यापित करना चाह सकते हैं कि जीसीसी कुछ पुनरावर्ती कार्यों पर पूंछ कॉल अनुकूलन कर रहा है, क्योंकि इसके बिना आप संभावित रूप से स्टैक को ओवरफ्लो कर सकते हैं।


मुझे आश्चर्य है कि आपको ऐसा करने के लिए कैसे मिला ... मैंने हमेशा सिर्फ इसलिए कहा कि अगर मुझे इसकी आवश्यकता है तो विधानसभा को डंप करने के लिए कहा जाए।

35

मुझे आश्चर्य है कि किसी ने भी अभी तक यह नहीं कहा है - जहां तक ​​मेरा सबसे उपयोगी झंडा है, -gजो डिबगिंग की जानकारी को निष्पादन योग्य में डाल देता है, जैसे कि आप इसे डिबग कर सकते हैं और स्रोत के माध्यम से कदम बढ़ा सकते हैं (जब तक कि आप कुशल और पढ़ने वाले विधानसभा और stepiकिसी प्रोग्राम के कमांड की तरह ) जिस पर अमल हो रहा है।


35

-fmudflap - UB को पकड़ने के लिए सभी जोखिम भरे पॉइंटर ऑपरेशन में रनटाइम चेक जोड़ता है। यह प्रभावी रूप से आपके प्रोग्राम को फिर से बफर ओवरफ्लो करता है और सभी प्रकार के झूलने वाले बिंदुओं को पकड़ने में मदद करता है।

यहाँ एक डेमो है:

$ cat mf.c 
int main()
{
 int a[10];
 a[10]=1; // <-- o noes, line 4
}

$ gcc -fmudflap mf.c -lmudflap
$ ./a.out 
*******
mudflap violation 1 (check/write): time=1280862302.170759 ptr=0x7fff96eb3d00 size=44
pc=0x7f3a575503c1 location=`mf.c:4:2 (main)'
      /usr/lib/libmudflap.so.0(__mf_check+0x41) [0x7f3a575503c1]
      ./a.out(main+0x90) [0x400a54]
      /lib/libc.so.6(__libc_start_main+0xfd) [0x7f3a571e2c4d]
Nearby object 1: checked region begins 0B into and ends 4B after
mudflap object 0xf9c560: name=`mf.c:3:6 (main) a'
bounds=[0x7fff96eb3d00,0x7fff96eb3d27] size=40 area=stack check=0r/3w liveness=3
alloc time=1280862302.170749 pc=0x7f3a57550cb1
number of nearby objects: 1

हम्म, मडफ्लैप बहुत बुरा लगता है: P
मैट जॉइनर

9
-fmudflapGCC 4.9 के बाद से समर्थित नहीं है, आपको मिलता है warning: switch '-fmudflap' is no longer supported। इसका पता AddressSanitizer द्वारा दिया गया था।
अगस्टिनो

21

वास्तव में C / C ++ से संबंधित नहीं है, लेकिन उपयोगी वैसे भी:

@file

उपरोक्त सभी अच्छे झंडे (जो आप सभी ने निर्दिष्ट किए हैं) को एक 'फ़ाइल' में रखें, और इस ऊपर के झंडे का उपयोग उस फ़ाइल के सभी झंडे एक साथ करने के लिए करें।

उदाहरण के लिए:

फ़ाइल: compilerFlags

-दीवार

-std = c99

-Wextra

फिर संकलन करें:

gcc yourSourceFile @compilerFlags

15

-march=native प्लेटफ़ॉर्म (= चिप) के लिए अनुकूलित कोड का उत्पादन करने के लिए जिस पर आप संकलन कर रहे हैं


2
यदि आप गैर-देशी मशीनों के लिए संकलन कर रहे हैं, जहाँ आपको लक्ष्य का पता नहीं है, तो आप mtune = xxx का उपयोग कर सकते हैं, जो बिना निर्देश सेट का उपयोग किए अनुकूलन करता है। उदाहरण के लिए mtune = जेनेरिक को "औसत" केस प्रोसेसर के साथ अद्यतित रखा जाता है।
टरिक्स

15

यदि आपको प्रीप्रोसेसर झंडे को जानना जरूरी है जो संकलक द्वारा पूर्वनिर्धारित हैं:

echo | gcc -E -dM -

13

यह त्रुटियों का पता लगाने के लिए वास्तव में उपयोगी नहीं है, लेकिन शायद ही कभी उल्लेख किया गया -masm=intelविकल्प -Sअसेंबली आउटपुट का निरीक्षण करने के लिए उपयोग करता है, बहुत अच्छे।

एटी एंड टी असेंबली सिंटैक्स मेरे सिर को बहुत अधिक चोट पहुँचाता है।


2
मेरे लिए एटी एंड टी और इंटेल के बीच का अंतर सी # और जावा के बीच का अंतर है। सिर्फ वाक्य रचना। दोनों ही भयानक। :)
मैट जॉइनर

2
G @ बनाने के लिए +1 @michael इंटेल सिंटैक्स का उपयोग करें, बजाय गॉड एंड टी में भयानक। असेंबली का निरीक्षण पर्याप्त मस्तिष्क चक्रों का उपयोग करता है - मस्तिष्क चक्रों को बर्बाद करने की कोई आवश्यकता नहीं है जो src opcodes में भाग्य से पहले जाते हैं। अब यदि केवल अन्य कंपाइलरों की तरह __asm ​​{} इनलाइन का समर्थन करता है तो हम सभी सेट हो जाते हैं!
महानुभाव

10

मेरे मेकअप में आम तौर पर शामिल होते हैं

  CFLAGS= -Wall -Wextra -Weffc++ -Os -ggdb
  ...
  g++ $(CFLAGS) -o junk $<
  gcc $(CFLAGS) -o $@ $<
  rm -f junk

इन विकल्पों में से सबसे महत्वपूर्ण पर पहले भी चर्चा की जा चुकी है, इसलिए मैं उन दो विशेषताओं को इंगित करूँगा जो अभी तक इंगित नहीं की गई हैं:

भले ही मैं एक codebase उस पर काम कर रहा हूँ की जरूरत है कुछ ऐसा मंच है जो करने के लिए पोर्टेबिलिटी के लिए सादा सी होने के लिए अभी भी भी कोई सभ्य सी ++ कंपाइलर नहीं है, मैं सी ++ कंपाइलर (सी कंपाइलर के अलावा) के साथ एक "अतिरिक्त" संकलन करता हूं। इसके 3 लाभ हैं:

  1. C ++ कंपाइलर कभी-कभी मुझे C कंपाइलर से बेहतर चेतावनी संदेश देता है।
  2. C ++ कंपाइलर -Weffc ++ विकल्प को स्वीकार करता है, जो कभी-कभार मुझे कुछ उपयोगी टिप्स देता है, जो मुझे याद आती है अगर मैं इसे केवल सादे सी में संकलित करता हूं।
  3. मैं सी + + को पोर्ट करने के लिए कोड को अपेक्षाकृत आसान रख सकता हूं, कुछ सीमा स्थितियों से बचकर, जहां सादा सी कोड अमान्य सी ++ कोड है (जैसे "बूल" नामक एक चर को परिभाषित करना)।

हां, मैं एक आशावादी आशावादी पोलीन्ना हूं जो सोचता रहता है कि निश्चित रूप से अब किसी भी महीने एक मंच को या तो अप्रचलित घोषित किया जाएगा, या एक सभ्य सी ++ कंपाइलर हासिल किया जाएगा, और हम अंत में सी ++ में स्विच कर सकते हैं। मेरे दिमाग में, यह अपरिहार्य है - एकमात्र सवाल यह है कि क्या प्रबंधन से पहले या बाद में ऐसा होता है कि सभी को एक टट्टू जारी करता है। :-)


सी ++ के रूप में इसे लिखने के साथ एक अच्छा बिंदु, मैं अक्सर इस पर विचार करता हूं। (सबसेट स्वाभाविक रूप से)
मैट जॉइनर

6
मुझे ध्यान देना चाहिए कि C ++ के पक्ष में C का पदावनति कभी नहीं होगा, क्षमा करें :)
मैट जॉइनर

4
विचार -o / देव / अशक्त के बजाय rm -f कबाड़
ulidtko

9
-Wstrict-prototypes -Wmissing-prototypes

10
और -Wold-style-definitionअगर आपको उन पुनरावृत्तियों से निपटना है जो सोचते हैं कि K & R स्टाइल फ़ंक्शंस एक अच्छा विचार है, भले ही प्रोटोटाइप घोषणाओं के साथ। (मुझे इस तरह के लोगों से निपटना होगा। यह वास्तव में मुझे तब परेशान करता है जब मुझे K & R में लिखा गया नया कोड मिल जाता है। यह पर्याप्त है कि K & R सामान होना निश्चित नहीं है, लेकिन नया कोड! गंप !!!)
जोनाथन लेफलर

9

यहाँ एक महान ध्वज है जिसका उल्लेख नहीं किया गया है:

-Werror-implicit-function-declaration

घोषित होने से पहले जब भी किसी फ़ंक्शन का उपयोग किया जाता है तो एक त्रुटि दें।


8
man gcc

मैनुअल अच्छे विवरणों के साथ दिलचस्प झंडे से भरा है। हालांकि, -Wall संभवत: क्रिया के रूप में gcc बना देगा। यदि आप अधिक दिलचस्प डेटा चाहते हैं, तो आपको त्रुटियों के लिए जाँच के लिए वेलग्रिंड या किसी अन्य उपकरण पर एक नज़र डालनी चाहिए।


1
यह loooooooooooooooooooooooooooong है, हालांकि। man gcc | nl11000 से अधिक लाइनें। यह कुख्यात bashमैनपेज से अधिक है !
new123456

12
भगवान का शुक्र है कि उन्होंने इसे उन ग़ैरक़ानूनी असाध्य "जानकारी" पृष्ठों में से एक के बजाय एक पुरुष पृष्ठ में बदल दिया।
मैट जॉइनर

6

ठीक है, -Wextraमानक होना चाहिए, भी। -Werrorचेतावनियों को त्रुटियों में बदल देता है (जो कि बहुत कष्टप्रद हो सकता है , खासकर यदि आप बिना संकलन करें -Wno-unused-result)। -pedanticके साथ सम्मिलन मेंstd=c89 आप अतिरिक्त चेतावनी देता है अगर आप C99 सुविधाओं का उपयोग करें।

इसके बारे में बस इतना ही। आप C कंपाइलर को C से कुछ अधिक प्रकार-सेव में ट्यून नहीं कर सकते हैं।


6

-M* विकल्पों का परिवार।

ये आपको ऐसी फाइलें बनाने देते हैं जो स्वचालित रूप से यह पता लगाती हैं कि आपकी सी या सी ++ स्रोत फ़ाइलों में से कौन सी हेडर फाइलें निर्भर करनी चाहिए। जीसीसी इस निर्भरता की जानकारी के साथ फाइल बनाएगा, और फिर आप उन्हें अपनी प्राथमिक मेक फाइल से हटा देंगे।

यहाँ -MD और -MP का उपयोग करते हुए एक अत्यंत सामान्य मेकफाइल का एक उदाहरण दिया गया है जो सी ++ स्रोत और हेडर फ़ाइलों से भरी निर्देशिका को संकलित करेगा, और सभी निर्भरताओं को स्वचालित रूप से समझेगा:

CPPFLAGS += -MD -MP                                         
SRC = $(wildcard *.cpp)                                                       

my_executable: $(SRC:%.cpp=%.o)                                                        
        g++ $(LDFLAGS) -o $@ $^                                               

-include $(SRC:%.cpp=%.d)

यहाँ एक ब्लॉग पोस्ट है जो इस पर अधिक गहराई से चर्चा करता है: http://www.microhowto.info/howto/automatically_generate_makefile_dependencies.html


6

वहाँ है -Werror, जो सभी चेतावनियों को त्रुटियों के रूप में मानता है और संकलन बंद कर देता है। gccमैन्युअल पृष्ठ अपने संकलक के लिए हर आदेश पंक्ति स्विच बताते हैं।


@Matt Joiner: चूंकि आपने यह नहीं बताया कि आप किस मशीन आर्किटेक्चर का उपयोग कर रहे हैं, gccझंडे आपके बीच अलग हो सकते हैं और जो भी लिंक किसी को भी सुझा सकते हैं। यही कारण है कि मैनुअल पेजों को आपके सॉफ़्टवेयर के साथ आपूर्ति की जाती है।
ग्रेग हेवगिल

4

-Wfloat-equal

प्रेषक: http://mces.blogspot.com/2005/07/char-const-argv.html

अन्य नई चेतावनियों में से एक जो मुझे पसंद है -Wfloat- बराबर है। जब भी आपके पास एक चेतावनी-संख्या एक समता की स्थिति में तैरती है। यह बहुत ही शानदार है! यदि आपके पास हर प्रोग्राम कंप्यूटर ग्राफिक्स या (बदतर :) कम्प्यूटेशनल ज्यामिति एल्गोरिदम है, तो आप जानते हैं कि कोई भी दो फ़्लोट कभी भी बराबरी के साथ मेल नहीं खाते ...


10
मेरे तैरता है समानता के साथ मेल खाते हैं, के रूप में मैं जानता हूँ कि मैं क्या कर रहा हूँ।
रोलैंड इलिग

4

मैंने पाया कि यह धागा एक विशेष मुद्दे को ठीक करने के लिए एक झंडे की तलाश में है, मैं इसे यहाँ नहीं देखता, इसलिए मैं इसमें एक जोड़ दूंगा जो मुझे मेरी पोस्ट पर बस स्टम्पिंग कर रहा था :

-Wformat=2झंडा

-Wformat=> सुनिश्चित करने के लिए कॉल की जाँच करें printfऔर scanfआदि, कि तर्क दिए गए प्रकार निर्दिष्ट स्ट्रिंग के लिए उपयुक्त हैं ...

और इसके बारे में वास्तव में महत्वपूर्ण हिस्सा ( जीसीसी मैनुअल के अनुसार ):

-Wformatमें शामिल है -Wall। जाँच, विकल्प प्रारूप के कुछ पहलुओं पर अधिक नियंत्रण के लिए -Wformat-y2k, -Wno-format-extra-args, -Wno-format-zero-length, -Wformat-nonliteral, -Wformat-security, और -Wformat=2-Wall.` में शामिल नहीं हैं उपलब्ध हैं, लेकिन

तो, सिर्फ इसलिए कि आपके पास -Wallइसका मतलब यह नहीं है कि आपके पास यह सब है। ;)


3

मैं कभी-कभी -sबहुत छोटे निष्पादन योग्य के लिए उपयोग करता हूं :

-s
    Remove all symbol table and relocation information from the executable.

स्रोत: http://gcc.gnu.org/onbuildocs/gcc/Link-Options.html#Link-Options


6
आपको बस stripअपने बाइनरी पर चलना चाहिए , इस तरह से आपके पास डिबग जानकारी के साथ एक बाइनरी हो सकती है, इसे बाद में वितरण के लिए हटा दें।
हेस्तूरुन

हां, stripकाम करता है, लेकिन -sजल्दी और आसान हो सकता है, हालांकि यह चलाने के रूप में विस्तृत नहीं हैstrip
Vasiliy Sharapov

3

हालांकि यह उत्तर थोड़ा-सा विषय हो सकता है और यह प्रश्न मेरे लिए एक योग्य +1 है, क्योंकि

मैं विशेष रूप से किसी भी अतिरिक्त चेतावनियों में दिलचस्पी रखता हूं, और / या कुछ मामलों में त्रुटियों में चेतावनी बदलकर किसी भी आकस्मिक प्रकार के बेमेल को कम से कम करने के लिए।
एक ऐसा उपकरण है जो सभी त्रुटियों और संभावित त्रुटियों को पकड़ना चाहिए जो स्पष्ट नहीं हो सकता है, वहां विभाजन है जो कि IMHO उस मामले के लिए gcc या किसी अन्य संकलक की तुलना में त्रुटियों को पकड़ने में बेहतर काम करता है। यह एक योग्य उपकरण है जो आपके टूल-चेस्ट में है।

एक लिंट-प्रकार के उपकरण जैसे स्प्लिंट के माध्यम से स्टेटिक चेकिंग, एक कंपाइलर टूलचैन का हिस्सा होना चाहिए।


यह हमेशा दिखाता है कि कोई त्रुटि C: \ _ में प्रीप्रोसेसर फ़ाइल दर्ज नहीं कर सकती है, मुझे यकीन नहीं है कि मुझे क्या करना है
सूरज जैन

2

मुझे विशेष रूप से किसी भी अतिरिक्त चेतावनी में दिलचस्पी है,

इसके अलावा -Wall, विकल्प -Wया -Wextraविकल्प ( -Wजीसीसी के पुराने संस्करणों के साथ-साथ नए लोगों के साथ काम करता है; और हाल के संस्करण वैकल्पिक नाम का समर्थन करते हैं -Wextra, जिसका अर्थ एक ही बात है, लेकिन अधिक वर्णनात्मक है) विभिन्न अतिरिक्त चेतावनियों को सक्षम करता है।

और भी चेतावनियाँ हैं जो उन दोनों में से किसी के लिए भी सक्षम नहीं हैं, आमतौर पर उन चीजों के लिए जो अधिक संदिग्ध हैं। उपलब्ध विकल्पों का सेट इस बात पर निर्भर करता है कि आप किस gcc संस्करण का उपयोग कर रहे हैं - परामर्श करें man gccया info gccविवरण के लिए, या उस विशेष gcc संस्करण के लिए ऑनलाइन दस्तावेज़ देखें जिसमें आप रुचि रखते हैं। और -pedanticविशेष मानक द्वारा उपयोग किए जा रहे सभी चेतावनी जारी करता है (जो निर्भर करता है) जैसे अन्य विकल्पों पर -std=xxxया -ansi) और जीसीसी एक्सटेंशन के उपयोग के बारे में शिकायत।

और / या कुछ मामलों में त्रुटियों में चेतावनी बदलकर किसी भी आकस्मिक प्रकार के बेमेल को कम से कम करने के लिए।

-Werrorसभी चेतावनियों को त्रुटियों में बदल देता है। मुझे नहीं लगता कि जीसीसी आपको विशेष चेतावनी के लिए चुनिंदा तरीके से करने देता है।

आप शायद पाएंगे कि आपको इस बारे में चयनात्मक होना है कि प्रति-परियोजना के आधार पर कौन सी चेतावनियाँ सक्षम हैं (विशेषकर यदि आप उपयोग करते हैं -Werror), क्योंकि बाहरी पुस्तकालयों की हेडर फाइलें उनमें से कुछ की यात्रा कर सकती हैं। ( -pedanticविशेष रूप से मेरे अनुभव में, इस संबंध में अनहेल्दी हो जाता है।)


4
"मुझे नहीं लगता कि जीसीसी आपको विशेष चेतावनी के लिए चुनिंदा रूप से करने देता है।" वास्तव में, आप के साथ कर सकते हैं -Werror=some-warning
मैथ्यू फ्लेशेन

0
  • -Wmissing-prototypes: यदि एक वैश्विक फ़ंक्शन को पिछले प्रोटोटाइप घोषणा के बिना परिभाषित किया गया है।
  • -Wformat-security: संभव सुरक्षा समस्याओं का प्रतिनिधित्व करने वाले प्रारूप कार्यों के उपयोग के बारे में चेतावनी देता है। वर्तमान में, यह उन कॉल printfऔर scanfफ़ंक्शंस के बारे में चेतावनी देता है जहाँ प्रारूप स्ट्रिंग एक स्ट्रिंग शाब्दिक नहीं है और कोई प्रारूप तर्क नहीं हैं

0
  • -Werror=return-type: फ़ंक्शन को लागू करें जब फ़ंक्शन के पास जीसीसी में कोई वापसी नहीं है। यह /we4716विजुअल स्टूडियो में है।

  • -Werror=implicit-function-declaration: फ़ंक्शन को परिभाषित किए बिना त्रुटि का उपयोग किया जाता है जब परिभाषित / शामिल नहीं किया जाता है। यह /we4013विजुअल स्टूडियो में है।

  • -Werror=incompatible-pointer-types: जब सूचक का प्रकार अपेक्षित पॉइंटर प्रकार से बेमेल हो जाता है तो त्रुटि हुई। यह /we4133विजुअल स्टूडियो में है।

वास्तव में, मैं अपना C कोड क्रॉस-प्लेटफ़ॉर्म रखना चाहता हूं, और मैं CMake का उपयोग करता हूं, और मैंने दिए गए cflags को CMakeLists.txt में डाल दिया है:

if (CMAKE_SYSTEM_NAME MATCHES "Windows")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /we4013 /we4133 /we4716")
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=implicit-function-declaration -Werror=incompatible-pointer-types -Werror=return-type")
endif()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.