2017-05-24 6 views
7

क्लैंग कंपाइलर स्निपेट के लिए चेतावनियों को उत्सर्जित करता है, जैसा कि here देखा जा सकता है।क्लैंग इन चेतावनियों को क्यों छोड़ता है?

clang++ -std=c++14 -O0 -Wall -pedantic -pthread main.cpp && ./a.out 
main.cpp:1:18: warning: braces around scalar initializer [-Wbraced-scalar-init] 
void point(int = {1}, int = {2}) {} 
       ^~~ 
main.cpp:1:29: warning: braces around scalar initializer [-Wbraced-scalar-init] 
void point(int = {1}, int = {2}) {} 
          ^~~ 

2 warnings generated. 

यह क्यों है?

void point(int = {1}, int = {2}) {} 

int main(){ 
    point(); 
} 

जहां तक ​​मेरा बता सकते हैं, {1} और {2}[dcl.fct.default]/1, [dcl.fct]/3 और [dcl.init]/1 के अनुसार पूरी तरह से वैध डिफ़ॉल्ट तर्क हैं।

struct example { 
    int member1; 
    int member2; 
}; 

example x = { 1, 2 }; 

बजना आप कह रहा है कि ब्रेसिज़ के आपके उपयोग किसी एकल मान आरंभ के लिए "सामान्य" नहीं है:

+6

ठीक है, यह केवल एक चेतावनी है, आईएमओ इसका मतलब है "अरे, यह बेकार है और अजीब लग रहा है, क्या आप वाकई यही मतलब है?"। – Quentin

+0

@Quentin जैसा कि यह एक पूरी तरह से वैध कोड प्रतीत होता है, वहां कोई चेतावनी नहीं होनी चाहिए। –

+6

बहुत सारे वैध स्निपेट हैं जो चेतावनियों को ट्रिगर करते हैं - अमान्य कोड त्रुटियों को ट्रिगर करता है। 'अगर (एक्स = कुछ()); 'एक और है। – Quentin

उत्तर

1

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

आप या तो पूर्णांक प्रारंभ करते समय ब्रेसिज़ का उपयोग करना बंद कर सकते हैं, या चेतावनी रिपोर्टिंग रोकने के लिए -Wno-braced-scalar-init कंपाइलर को ध्वज पास कर सकते हैं।

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