किस हेडर फ़ाइलों को शामिल करने के लिए कैसे निर्धारित करें?


13

कहें कि मेरे पास नीचे (बहुत सरल) कोड है।

#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


6
यदि आपको याद है कि स्ट्रिंग्सstd::stoi को संभालने के लिए आप अनुमान लगा सकते हैं कि <string>शामिल करने के लिए एक अच्छा हेडर होगा। या आप एक अच्छा संदर्भ खोज सकते हैं जो आपको बताएगा। और मेरा सुझाव है कि आप हमेशा हेडर फ़ाइलों को स्पष्ट रूप से शामिल करें, ताकि आपको गैर-पोर्टेबल कार्यान्वयन विशिष्ट व्यवहार पर भरोसा न करना पड़े।
कुछ प्रोग्रामर ने

3
सबसे अच्छा तरीका है कि किसी अन्य प्लेटफॉर्म पर जाने से पहले कपटी पर जाएं । वे वहाँ बहुत विस्तृत सामान है।
सिद्धार्थ

1
उपयुक्त हेडर को उस क्षण शामिल करें जब आप कोड लिखते हैं। अर्थात। जिस क्षण आप कोड लिखते हैं std::stoi, आप तुरंत सुनिश्चित करते हैं कि #include <string>वह मौजूद है।
सैंडर डी डायकर

3
सामान्य मामले में यह एक कठिन समस्या है । हालांकि, जब हम लापता मानक पुस्तकालय के बारे में बात कर रहे हैं, तो सामान्य तरीका वास्तव में सभी फ़ंक्शन कॉल / प्रकारों की जांच करना होगा।
मैक्स लैंगहॉफ

1
@ skratchi.at, छात्रों से कहा जाता है कि वे जो चाहें संकलक का उपयोग कर सकते हैं, जब तक कि उनका कोड मानक-अनुरूप न हो। 4 साल बाद, यह पहली बार है जब यह कभी भी एक मुद्दा रहा है।
क्रिसएम

जवाबों:


14

क्या क्रॉस-कंपाइलर संगतता सुनिश्चित करने का एक आसान / बेहतर तरीका है?

यदि आपके पास एक विशाल कोडबेस है और यह अब तक ऐसा नहीं कर रहा है, तो यह हमेशा थोड़ा सा चौका देने वाला है, लेकिन एक बार जब आप अपने शामिलों को ठीक कर लेते हैं, तो आप एक सरल प्रक्रिया पर टिक सकते हैं:

जब आप एक नया कोड लिखते हैं जो एक मानक सुविधा का उपयोग करता है, जैसे std::stoi, उस नाम को Google में प्लग करें, इसके लिए cppreference.com लेख पर जाएं, फिर ऊपर की ओर देखें कि यह किस हेडर में परिभाषित है।

फिर इसे शामिल करें, अगर यह पहले से ही शामिल नहीं है। काम हो गया!

(आप इसके लिए मानक का उपयोग कर सकते हैं, लेकिन यह उतना सुलभ नहीं है।)

सस्ते, अप्राप्य हैक्स जैसे के पक्ष में इसे बर्खास्त करने का लालच न करें <bits/stdc++.h>!


tl; डॉआर: प्रलेखन


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

5
@JosephWood: यदि आप नहीं जानते कि किसी दिए गए समारोह दुहराव के द्वारा होता है जो शीर्ष लेख, संभावना है कि आप कर रहे हैं चाहिए करने के लिए समारोह को देखने की अच्छी तरह जांच उस पर अपनी मान्यताओं वैसे भी, तो यह जानने जो शीर्षक तो यह और भी अतिरिक्त नहीं ले के अंतर्गत आता है समय।
देवसोलर

1
@ जोसेफवुड की तरह, मैं भी उम्मीद कर रहा था कि अधिक अनुभव वाले लोगों के पास बेहतर तरीका हो। मुझे पता है कि सबसे अधिक एसटीएल कार्यों के लिए कौन से हेडर शामिल हैं, लेकिन उम्मीद कर रहे थे कि छात्रों को पढ़ाने की तुलना में हर समारोह को देखने का एक आसान तरीका है: पी
क्रिसम नोव

1
@ क्रिसमम में शामिल उपकरण जैसे आप क्या-क्या उपयोग करते हैं । उनकी शुद्धता की गारंटी नहीं दी जा सकती है (और वास्तव में कभी-कभी मैनुअल काम करना आवश्यक है) लेकिन यह बिल्कुल भी बुरा नहीं है।
अजीब

4
@ChrisMM प्रलेखन का उल्लेख करने के लिए अपने छात्रों को पढ़ाना अविश्वसनीय, अविश्वसनीय रूप से महत्वपूर्ण है । इस साइट पर हजारों हर दिन कोई सांसारिक विचार के साथ स्ट्रीम करते हैं कि उन्हें यह करना चाहिए। प्रलेखन का उपयोग करना आसान / बेहतर तरीका है।
कक्षा

-1

दस्तावेज़ीकरण की समीक्षा करने और मैन्युअल रूप से (दर्दनाक और समय लेने वाली) करने के अलावा आप कुछ उपकरणों का उपयोग कर सकते हैं जो आपके लिए ऐसा कर सकते हैं।

आप Visual Studio में ReSharper का उपयोग कर सकते हैं जो आयात को व्यवस्थित करने में सक्षम है (वास्तव में VS बिना ReSharper बहुत उपयोग करने योग्य नहीं है)। यदि शामिल नहीं है तो इसे जोड़ने की सिफारिश की जाती है और यदि इसमें अप्रचलित रेखा शामिल है तो इसे और अधिक पीला रंगों में दिखाया गया है।

या आप CLION (सभी प्लेटफार्मों के लिए उपलब्ध) का उपयोग कर सकते हैं जिसमें यह क्षमता भी है (वास्तव में यह एक ही निर्माण JetBrains है)।

इसमें टूल भी शामिल है जिसे आपने उपयोग किया था , लेकिन इसका उद्देश्य आगे की घोषणा के फायदे हैं, मैंने कभी भी इसका इस्तेमाल नहीं किया (व्यक्तिगत रूप से - मेरी टीम के साथी ने हमारी परियोजना के लिए ऐसा किया था)।


जब अन्य हेडर पहले से ही काम करता है (यानी iostream पहले से ही शामिल है, तो स्ट्रिंग का सुझाव नहीं देंगे) IIRC
रियाद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.