कहें कि मेरे पास नीचे (बहुत सरल) कोड है।
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
यह जी ++ और क्लैंग दोनों पर ठीक संकलन करता है; हालाँकि, यह निम्न त्रुटि के साथ MSVC पर संकलित करने में विफल रहता है:
त्रुटि C2039: 'stoi': 'std' का सदस्य नहीं है
त्रुटि C3861: 'stoi': पहचानकर्ता नहीं मिला
मुझे पता है कि std::stoiयह <string>हेडर का हिस्सा है , जो संभवतः दो पूर्व संकलकों के हिस्से के रूप में शामिल है <iostream>और बाद वाला नहीं है। C ++ मानक के अनुसार [res.on.headers]
C ++ हेडर में अन्य C ++ हेडर शामिल हो सकते हैं।
जो, मेरे लिए, मूल रूप से कहता है कि सभी तीन संकलक सही हैं।
यह समस्या तब उत्पन्न हुई जब मेरे एक छात्र ने काम जमा किया, जिसे टीए ने संकलन के रूप में चिह्नित किया; मैं निश्चित रूप से गया और इसे तय किया। हालांकि, मैं भविष्य की घटनाओं को इस तरह से रोकना चाहूंगा। तो, क्या यह निर्धारित करने का एक तरीका है कि कौन सी हेडर फ़ाइलों को शामिल किया जाना चाहिए, हर बार जांचने के लिए तीन अलग-अलग कंपाइलरों पर संकलन करने से कम?
एकमात्र तरीका जो मैं सोच सकता हूं, यह सुनिश्चित करना है कि प्रत्येक stdफ़ंक्शन कॉल के लिए, एक उपयुक्त शामिल मौजूद है; लेकिन अगर आपके पास मौजूदा कोड है जो हजारों लाइनों की लंबी है, तो यह खोज करने के लिए थकाऊ हो सकता है। क्या क्रॉस-कंपाइलर संगतता सुनिश्चित करने का एक आसान / बेहतर तरीका है?
तीन संकलक के साथ उदाहरण: https://godbolt.org/z/kJhS6U
std::stoi, आप तुरंत सुनिश्चित करते हैं कि #include <string>वह मौजूद है।
std::stoiको संभालने के लिए आप अनुमान लगा सकते हैं कि<string>शामिल करने के लिए एक अच्छा हेडर होगा। या आप एक अच्छा संदर्भ खोज सकते हैं जो आपको बताएगा। और मेरा सुझाव है कि आप हमेशा हेडर फ़ाइलों को स्पष्ट रूप से शामिल करें, ताकि आपको गैर-पोर्टेबल कार्यान्वयन विशिष्ट व्यवहार पर भरोसा न करना पड़े।