2012-10-12 17 views
5

コマンドライン引数をメイン(組織と読みやすいコード用)から処理するためのコードを大量に保存したい場合は、どのような方法が最適でしょうか?main()の外側でargcとargvを処理する

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

答えて

4

パラメータとして渡す、またはグローバル変数に格納しますどちらか。あなたがmainから戻って、グローバルスコープの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(); 
    ... 
} 

は、より良いデザインであり、あなたがしたいか、簡単にプログラムを変換する場合は、/代替パラメータを変更してみましょうライブラリに入れる。何らかの理由でargsにアクセスする関数がたくさんある場合は、それらを一度格納するだけで、すべての関数の間を渡す必要はないので、グローバル変数は簡単です。

2

は、単にあなたがそれらを処理したい関数の引数としてargcargvを渡します。

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

3

実用的なところであれば誰でも標準に準拠する必要があります。このように、有効なCまたはC++ではありませんでした

void main 

を書いていないが、代わりにそれと

int main 

を書き、あなたのコードは、例えばしてコンパイルすることができますg ++(通常のコンパイラオプション付き)。

void mainがあるとすれば、私はWindows環境と思われます。とにかく、Windows環境でのプログラムの使用をサポートするためには、Windowsでmain引数を使用しないでください。 * nixではそれらがその環境の中で、そしてその環境のために設計されたので、彼らは* nixで動作します。デフォルトでは(非常に強力な規約で)Windows ANSIとしてエンコードされているため、ユーザーの現在のロケール以外の文字でファイル名をエンコードすることはできないため、一般にWindowsでは動作しません。

Windowsの場合は、GetCommandLine API関数とその姉妹構文解析関数を使用することをお勧めします。移植性のためには、これはいくつかのコマンドライン引数モジュールにカプセル化する方がよいでしょう。次に、Windowsでwchar_tを使用し、* nix&hellipのcharという興味深い問題に対処する必要があります。

とにかく、対応する* nix APIがあるかどうかわかりません。最悪の場合、* nixの場合は、コマンドライン引数モジュールを常にmainから初期化することができます。 * nixの醜さは、C++の最も移植性のない、OS固有の構造体である標準mainで移植性をサポートする必要から直接得られます。

+0

私は 'void main'より' int main'に全面的に同意します。これは、おそらくもっと便利です。しかし、もうひとつの解説は、私を夢中にさせる。 Windows以外のどのシステムで 'main()'の標準C++規約に問題がありますか?私は1つを認識していないので、標準的な規約を「非ポータブル」および「OS固有」とすると、OTTのように見えます。 –

+0

@JonathanLeffler:私は、Windows以外の 'main'引数がうまくいかない(英語アルファベットの純粋なASCIIテキスト以外の)Windows以外の一般的に使われているシステムは認識していません。それでも、Windows **では動作しない機能は**ポータブルではなく、Unix-land **用に設計された機能は** OS特有のものです。また、Windowsの場合(つまり移植性がない)、Unix-land(つまりOS特有のもの)用に設計されており、その2つの側面が強く結びついているという主な引数の慣習があります。それについて面白いことは絶対にありません。私はその永続性について醜い政治的理由しか考えられません。 –

0

"getoptlong"ファミリの関数とライブラリを確認してください。これらは、プログラムが想定している引数を構造化して定義し、簡単に解析することができます。ドキュメンテーション/ヘルプレスポンスの生成にも役立ちます。

これはUNIXの世界では古いライブラリであり、C#には.Netの実装もあります。

関連する問題