मैं बेचैन हूँ। इसलिए, जांच के चश्मे को लगाने का समय और चूंकि मेरे पास संकलक या संकलन झंडे तक पहुंच नहीं है, मुझे आविष्कारक होने की आवश्यकता है। इसके अलावा, क्योंकि इस कोड के बारे में कुछ भी समझ में नहीं आता है कि यह हर धारणा पर एक बुरा विचार सवाल नहीं है।
पहले वास्तविक प्रकार की जांच करते हैं gets
। मैं उस के लिए एक छोटी सी चाल है:
template <class> struct Name;
int main() {
Name<decltype(gets)> n;
// keep this function call here
cout << FirstFactorial(gets(stdin));
return 0;
}
और यह दिखता है ... सामान्य:
/tmp/613814454/Main.cpp:16:19: warning: 'gets' is deprecated [-Wdeprecated-declarations]
Name<decltype(gets)> n;
^
/usr/include/stdio.h:638:37: note: 'gets' has been explicitly marked deprecated here
extern char *gets (char *__s) __wur __attribute_deprecated__;
^
/usr/include/x86_64-linux-gnu/sys/cdefs.h:254:51: note: expanded from macro '__attribute_deprecated__'
# define __attribute_deprecated__ __attribute__ ((__deprecated__))
^
/tmp/613814454/Main.cpp:16:26: error: implicit instantiation of undefined template 'Name<char *(char *)>'
Name<decltype(gets)> n;
^
/tmp/613814454/Main.cpp:12:25: note: template is declared here
template <class> struct Name;
^
1 warning and 1 error generated.
gets
के रूप में चिह्नित किया गया है और हस्ताक्षर हैं char *(char *)
। लेकिन फिर FirstFactorial(gets(stdin));
संकलन कैसे हो ?
चलो कुछ और कोशिश करते हैं:
int main() {
Name<decltype(gets(stdin))> n;
// keep this function call here
cout << FirstFactorial(gets(stdin));
return 0;
}
जो हमें देता है:
/tmp/286775780/Main.cpp:15:21: error: implicit instantiation of undefined template 'Name<int>'
Name<decltype(8)> n;
^
अंत में हमें कुछ मिल रहा है decltype(8)
:। तो पूरे gets(stdin)
को इनपुट के साथ बदल दिया गया था ( 8
)।
और चीजों को निराई मिलती है। संकलक त्रुटि जारी है:
/tmp/596773533/Main.cpp:18:26: error: no matching function for call to 'gets'
cout << FirstFactorial(gets(stdin));
^~~~
/usr/include/stdio.h:638:14: note: candidate function not viable: no known conversion from 'struct _IO_FILE *' to 'char *' for 1st argument
extern char *gets (char *__s) __wur __attribute_deprecated__;
तो अब हमें इसके लिए अपेक्षित त्रुटि मिलती है cout << FirstFactorial(gets(stdin));
मैंने एक मैक्रो के लिए जाँच की और #undef gets
लगता है कि ऐसा कुछ भी नहीं है, ऐसा लगता है कि यह मैक्रो नहीं है।
परंतु
std::integral_constant<int, gets(stdin)> n;
यह संकलित करता है।
परंतु
std::integral_constant<int, gets(stdin)> n; // OK
std::integral_constant<int, gets(stdin)> n2; // ERROR wtf??
n2
लाइन पर अपेक्षित त्रुटि के साथ नहीं है ।
और फिर, लगभग किसी भी संशोधन से अपेक्षित त्रुटि के main
लिए लाइन को cout << FirstFactorial(gets(stdin));
थूक दिया जाता है।
इसके अलावा stdin
वास्तव में खाली लगता है।
इसलिए मैं केवल निष्कर्ष निकाल सकता हूं और अनुमान लगा सकता हूं कि उनके पास एक छोटा सा कार्यक्रम है जो स्रोत को पार्स करता है और gets(stdin)
वास्तव में संकलक में खिलाने से पहले परीक्षण केस इनपुट मूल्य से बदलने की कोशिश करता है (खराब) । यदि किसी के पास एक बेहतर सिद्धांत है या वास्तव में जानता है कि वे क्या कर रहे हैं तो कृपया साझा करें!
यह स्पष्ट रूप से एक बहुत बुरा अभ्यास है। इस पर शोध करते समय मैंने पाया कि इस बारे में कम से कम एक प्रश्न ( उदाहरण ) है और क्योंकि लोगों को पता नहीं है कि वहाँ एक साइट है जो ऐसा करता है जो उनका जवाब है "उपयोग न gets
करें ... इसके बजाय" जो वास्तव में है एक अच्छी सलाह है, लेकिन केवल ओपी को अधिक भ्रमित करता है क्योंकि स्टड से एक वैध रीड पर कोई भी प्रयास इस साइट पर विफल हो जाएगा।
TLDR
gets(stdin)
अमान्य है C ++। यह एक नौटंकी है जो इस विशेष साइट का उपयोग करती है (किन कारणों से मैं इसका पता नहीं लगा सकता)। यदि आप साइट पर सबमिट करना जारी रखना चाहते हैं (मैं न तो इसका समर्थन कर रहा हूं और न ही इसे एंडोर्स कर रहा हूं) तो आपको इस निर्माण का उपयोग करना होगा, अन्यथा इसका कोई मतलब नहीं होगा, लेकिन ध्यान रखें कि यह भंगुर है। लगभग किसी भी संशोधन में main
एक त्रुटि होगी। इस साइट के बाहर सामान्य इनपुट रीडिंग विधियों का उपयोग किया जाता है।
stdin
मानक पुस्तकालय में एक हैFILE*
, और किसी भी प्रकार के लिए एक सूचक धर्मान्तरितchar*
, जो के तर्क का प्रकार हैgets()
। हालाँकि, आपको कभी भी, कभी भी, कभी भी किसी सी सी प्रतियोगिता के बाहर उस तरह का कोड नहीं लिखना चाहिए। यदि आपका कंपाइलर भी इसे स्वीकार करता है, तो अधिक चेतावनी झंडे जोड़ें, और यदि आप एक कोडबेस को ठीक करने की कोशिश कर रहे हैं, जिसमें इसका निर्माण है, तो चेतावनियों को त्रुटियों में बदल दें।