2012-10-12 26 views
5

यदि मैं मुख्य कोड (संगठन और अधिक पठनीय कोड के लिए) कमांड लाइन तर्कों को संसाधित करने के लिए अपने कोड का बड़ा हिस्सा रखना चाहता हूं, तो ऐसा करने का सबसे अच्छा तरीका क्या होगा?प्रक्रिया के बाहर argc और argv प्रक्रिया()

void main(int argc, char* argv[]){ 
    //lots of code here I would like to move elsewhere 
} 

उत्तर

4

या तो उन्हें पैरामीटर के रूप में पारित, या उन्हें वैश्विक चर में संग्रहीत करते हैं। जब तक आप मुख्य से वापस नहीं आते हैं और atexit हैंडलर या वैश्विक दायरे पर ऑब्जेक्ट के विनाशक में उन्हें संसाधित करने का प्रयास करते हैं, तब भी वे मौजूद हैं और किसी भी दायरे से पहुंचने के लिए ठीक होंगे।

उदाहरण के लिए:

// Passing them as args: 
void process_command_line(int argc, char **argv) 
{ 
    // Use argc and argv 
    ... 
} 

int main(int argc, char **argv) 
{ 
    process_command_line(argc, argv); 
    ... 
} 

वैकल्पिक रूप से: के बाद से यह समझाया और के अगर तुम चाहते हो तुम/स्थानापन्न मापदंडों को संशोधित करने या जाने आसानी से अपने कार्यक्रम कन्वर्ट है

// Global variables 
int g_argc; 
char **g_argv; 

void process_command_line() 
{ 
    // Use g_argc and g_argv 
    ... 
} 

int main(int argc, char **argv) 
{ 
    g_argc = argc; 
    g_argv = argv; 
    process_command_line(); 
    ... 
} 

उन्हें पैरामीटर के रूप में पासिंग, एक बेहतर डिजाइन है एक पुस्तकालय में। वैश्विक चर आसान हैं, क्योंकि यदि आपके पास कई अलग-अलग फ़ंक्शन हैं जो किसी भी कारण से तर्कों तक पहुंचते हैं, तो आप उन्हें एक बार स्टोर कर सकते हैं और उन्हें विभिन्न कार्यों के बीच उन्हें पास रखने की आवश्यकता नहीं है।

2

सीधे शब्दों में समारोह के तर्कों जिसमें आप उन्हें कार्रवाई करने के लिए चाहते हैं के रूप में argc और argv गुजरती हैं।

void parse_arg(int argc, char *argv[]);

3

जहां भी व्यावहारिक हो, मानकों को मानना ​​चाहिए। इस प्रकार,

void main 

जो वैध सी या सी ++ कभी नहीं लिखना नहीं है, लेकिन बजाय

int main 
इसी के साथ

लिखते हैं, अपने कोड उदाहरण के साथ संकलन कर सकते हैं जी ++ (सामान्य कंपाइलर विकल्पों के साथ)।

void main को देखते हुए मुझे एक विंडोज वातावरण पर संदेह है। और वैसे भी, विंडोज वातावरण में अपने प्रोग्राम के उपयोग का समर्थन करने के लिए, आपको Windows में main तर्कों का उपयोग नहीं करना चाहिए। वे * निक्स में काम करते हैं क्योंकि वे उस वातावरण में और उसके लिए डिजाइन किए गए थे; वे विंडोज़ में सामान्य काम नहीं करते हैं, क्योंकि डिफ़ॉल्ट रूप से (बहुत मजबूत कन्वेंशन द्वारा) वे विंडोज एएनएसआई के रूप में एन्कोड किए जाते हैं, जिसका अर्थ है कि वे उपयोगकर्ता के मौजूदा लोकेल के बाहर वर्णों के साथ फ़ाइल नाम एन्कोड नहीं कर सकते हैं।

तो विंडोज़ के लिए आप GetCommandLine एपीआई फ़ंक्शन और इसकी बहन पार्सिंग फ़ंक्शन का बेहतर उपयोग करते हैं। पोर्टेबिलिटी के लिए इसे कुछ कमांड लाइन तर्क मॉड्यूल में बेहतर ढंग से encapsulated किया जाना चाहिए। फिर आपको विंडोज़ में wchar_t और * nix & hellip में char का उपयोग करने की रोचक समस्या से निपटने की आवश्यकता है;

वैसे भी, मुझे संबंधित * निक्स एपीआई, या यहां तक ​​कि अगर कोई है, लेकिन Google पर भी यकीन नहीं है। सबसे बुरे मामले में, * निक्स के लिए आप हमेशा main से कमांड लाइन तर्क मॉड्यूल प्रारंभ कर सकते हैं। * निक्स के लिए कुरूपता सी ++ के सबसे गैर पोर्टेबल, ओएस-विशिष्ट निर्माण, अर्थात् मानक main के साथ पोर्टेबिलिटी का समर्थन करने की आवश्यकता से सीधे उत्पन्न होती है।

+0

मैं पूरी तरह से 'मुख्य मुख्य' पर 'मुख्य मुख्य' से सहमत हूं। हालांकि, दूसरी टिप्पणी मुझे छोड़ देता है ... bemused। विंडोज़ के अलावा कौन सी प्रणाली मानक सी ++ सम्मेलन के साथ 'मुख्य()' के लिए एक समस्या है? मुझे एक के बारे में पता नहीं है, इसलिए मानक सम्मेलन को 'गैर पोर्टेबल' और 'ओएस-विशिष्ट' के रूप में ओटीटी लगता है। –

+0

@ जोनाथन लेफ्लर: मुझे विंडोज़ के अलावा किसी भी सामान्य रूप से प्रयुक्त सिस्टम से अवगत नहीं है, जहां 'मुख्य' तर्क काम नहीं करते हैं (अंग्रेजी वर्णमाला शुद्ध ASCII पाठ के अलावा)। फिर भी, एक सुविधा जो विंडोज ** में काम नहीं करती है ** गैर पोर्टेबल है, और यूनिक्स-भूमि ** के लिए डिज़ाइन की गई सुविधा ** ओएस-विशिष्ट है। और 'मुख्य' तर्क सम्मेलन दोनों विंडोज़ में काम नहीं करते हैं (यानी गैर पोर्टेबल है), और यूनिक्स-भूमि (यानी ओएस-विशिष्ट है) के लिए डिज़ाइन किया गया है, और उन दो पहलुओं को दृढ़ता से जुड़ा हुआ है। इसके बारे में बिल्कुल कुछ भी मनोरंजक नहीं है। मैं केवल अपनी दृढ़ता के लिए बदसूरत राजनीतिक कारणों के बारे में सोच सकता हूं। –

0

कार्यों और पुस्तकालयों के परिवार "getoptlong" देखें। ये आपके कार्यक्रम की अपेक्षाओं को परिभाषित करने का एक संरचित तरीका प्रदान करते हैं और फिर उन्हें आपके लिए आसानी से पार्स कर सकते हैं।दस्तावेज़ीकरण/सहायता प्रतिक्रियाओं की पीढ़ी के साथ भी मदद कर सकते हैं।

यह यूनिक्स दुनिया में पुरानी लाइब्रेरी है, और सी # में भी .NET कार्यान्वयन है। (+ पर्ल, रूबी, & शायद अधिक। इन सभी में एक भी प्रतिमान उपयोग करने योग्य है! एक बार जानें, हर जगह उपयोग करें!)