コマンド ライン引数を処理するためのコードの大部分を main から除外したい場合 (整理と読みやすいコードのために)、それを行う最善の方法は何でしょうか?
void main(int argc, char* argv[]){
//lots of code here I would like to move elsewhere
}
実用的なところでは、標準を守る必要があります。したがって、書かないでください
void main
これは有効な C または C++ ではありませんでしたが、代わりに次のように記述します。
int main
これにより、コードをg++
(通常のコンパイラ オプションを使用して) eg でコンパイルできます。
Windowsvoid main
環境だと思います。とにかく、Windows 環境でのプログラムの使用をサポートするために、Windowsmain
で引数を使用しないでください。それらは *nix 環境で、その環境向けに設計されているため、*nix で動作します。デフォルトでは (非常に強力な規則により) Windows ANSI としてエンコードされているため、通常は Windows では機能しません。つまり、ユーザーの現在のロケール以外の文字を使用してファイル名をエンコードすることはできません。
したがって、Windows の場合は、GetCommandLine
API 関数とその姉妹解析関数を使用することをお勧めします。移植性のために、これはいくつかのコマンドライン引数モジュールにカプセル化する必要があります。wchar_t
次に、Windows とchar
*nixでの使用に関する興味深い問題に対処する必要があります…
とにかく、対応する *nix API がわからない、またはあったとしても、Google で検索してください。最悪の場合、*nix の場合、いつでもコマンドライン引数モジュールを から初期化できますmain
。*nix の醜さは、C++ の最も移植性の低い OS 固有の構造、すなわち standard で移植性をサポートする必要性に直接起因していますmain
。
パラメータとして渡すか、グローバル変数に格納します。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();
...
}
それらをパラメーターとして渡すことは、カプセル化されており、必要に応じてパラメーターを変更/置換したり、プログラムをライブラリに簡単に変換したりできるため、より優れた設計です。なんらかの理由で引数にアクセスするさまざまな関数が多数ある場合、それらを一度格納するだけで、さまざまな関数間でそれらを渡し続ける必要がないため、グローバル変数の方が簡単です。
それらを処理する関数の引数としてargc
andを渡すだけです。argv
void parse_arg(int argc, char *argv[]);
Linux は と を提供program_invocation_name
しprogram_invocation_name_short
ます。