2015-04-18 37 views
11

आज मैंने अपने कार्यक्रम में एक छोटा टाइपो बनाया, और घूम रहा था कि मुझे कोई आउटपुट क्यों नहीं मिला, हालांकि कार्यक्रम ठीक से संकलित हुआ। मूल रूप से यह कम कर देता है:<<बजाय << स्ट्रीम आउटपुट में संकलन क्यों करता है?

#include <iostream> 

int main() 
{ 
    std::cout < "test"; // no << but < 
} 

मैं बिल्कुल पता नहीं अंतर्निहित रूपांतरण किस तरह यहां किया जाता है तो कार्यक्रम अभी भी संकलित है (दोनों जी ++ 4.9.2 और यहां तक ​​कि जी ++ 5)। मुझे अभी एहसास हुआ कि क्लैंग ++ कोड को खारिज कर देता है। क्या void* पर कोई रूपांतरण किया जा रहा है (कुछ और नहीं सोच सकता)? मुझे ऐसा कुछ याद आ रहा है, लेकिन मैंने सोचा कि इसे जी ++ 5 में संबोधित किया गया था, लेकिन ऐसा लगता है कि यह मामला नहीं है।

संपादित करें: मैं -std=c++11 साथ संकलन नहीं कर रहा था, इसलिए कोड में मान्य था पूर्व सी ++ 11 (ostream की void* करने के लिए रूपांतरण के कारण)। -std=c++11 g ++ 5 के साथ संकलन करते समय कोड को अस्वीकार कर दिया जाता है, g ++ 4.9 अभी भी इसे स्वीकार करता है।

+2

मुझे एक अप्रयुक्त गणना मूल्य के बारे में g ++ 4.9.2 से चेतावनी मिलती है, हालांकि '-Wall' का उपयोग करते समय भी। –

+0

@ राफेल वास्तव में, जब मैंने संकलित किया तो मैंने सभी चेतावनियों को नहीं देखा, अब मैं देखता हूं और महसूस किया कि क्या हुआ, हालांकि यह कहना चाहिए कि यह थोड़ा असामान्य है। मैं ज्यादातर समय '-वॉल' का उपयोग करता हूं, हालांकि यह कोड का एक छोटा टुकड़ा था जिसे मैंने उत्कृष्ट पाठ में संकलित किया और महसूस किया कि यह जादुई रूप से काम करता है – vsoftco

+0

क्यों [यह] (http://coliru.stacked-crooked.com/a/ 667a9c3ad1ee9afe) आउटपुट के रूप में 0 देता है? – Destructor

उत्तर

9

हाँ, संकलक एक void* को cout परिवर्तित।

mov edi, OFFSET FLAT:std::cout+8 
    call std::basic_ios<char, std::char_traits<char> >::operator void*() const 
    cmp rax, OFFSET FLAT:.LC0 
    setb al 
    test al, al 

कौन सा यह स्पष्ट है कि operator void* दोषी है बनाता है: यदि आप कोड के disassembly पाने के लिए -S स्विच का उपयोग करें, तो आप कुछ इस तरह देखेंगे।

बिल लिंच ने जो कहा, उसके विपरीत, मैं इसे Compiler Explorer पर पुन: उत्पन्न करने में सक्षम हूं। हालांकि, यह कार्यान्वयन दोष प्रतीत होता है, क्योंकि C++ 11 को operator void*operator boolbasic_ios पर बदलना चाहिए था।

+0

सी ++ 11 में, 'std :: ostream' पर कोई 'ऑपरेटर शून्य *()' नहीं है। तो यह एक कार्यान्वयन दोष होगा। –

+0

मुझे लगता है कि यह g ++ 4.9 में एक दोष है (g ++ 5 इसे अस्वीकार करता है) – vsoftco

+0

g ++ 4.9 ** ** कुछ बिंदुओं में पूरी तरह से C++ 11 अनुपालन नहीं है, यह एबीआई को तोड़ने के लिए नहीं है। यह चीजों में से एक है। जी ++ 5 पूरी तरह से सी ++ 11 अनुरूप होगा। –

5

यह केवल C++ 11 से पहले मान्य है।

आप मूल रूप से कर रहे हैं: ((void *) std::cout) < ((char *) "test")

+0

क्षमा करें, मैं इसे वापस लेता हूं, '-std = C++ 11' का उपयोग नहीं कर रहा था .... g ++ 5 वास्तव में इसे अस्वीकार करता है, g ++ 4.9.2 नहीं, यहां तक ​​कि '-std = c + + 11'। – vsoftco

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