OpenSiv3D icon indicating copy to clipboard operation
OpenSiv3D copied to clipboard

コマンドライン引数をパースする機能

Open ROCKTAKEY opened this issue 2 years ago • 2 comments

追加する機能の内容 | Describe the solution you'd like コマンドライン引数をパースする機能。

その機能の追加によって解決する問題 | Is your feature request related to a problem? Please describe. GetCommandLineArgs()は型がArray<String>&になっているため、main関数の引数(int argc, char **argv)の形をそのまま取るような大半のコマンドライン引数解析ライブラリにそのまま渡すことができません。OpenSiv3Dでコマンドライン引数のパース機能を用意することで、GetCommandLineArgs()の返り値をそのまま渡して解析できれば、煩わしい型の変換を行わずに済みます。 また、コマンドラインオプションの解析は多くの場合メインの機能ではない一方で、ある程度大きなものを作ろうとするとほぼ必須になるという絶妙な立ち位置にいるため、OpenSiv3Dのような比較的大きなフレームワークに付属する機能として適切だと考えています。

備考 | Additional context boostのものをString型にしただけのラッパだけでも、あるとコマンドライン引数の取り回しが楽になると思います。

https://boostjp.github.io/tips/program_options.html https://www.boost.org/doc/libs/1_80_0/doc/html/program_options.html

GUIツールであっても、ファイル名やオプションをコマンドライン引数で受け取る場面はよく見かけます。たとえばテキストエディタやPDFリーダーなどは他のツールなどから引数付きで呼び出したい場面が多いです。ゲームやシミュレータでも「ある特定のセーブデータや初期条件を読み込んで実行」など、ショートカットやエイリアスで特定の状態となったGUIを立ち上げたり、あるいはCLIのみで処理してエクスポート作業を自動化したりするのに有用だと考えています。

ROCKTAKEY avatar Nov 04 '22 16:11 ROCKTAKEY

応急措置ですが、Windows の場合、次のようなコンパイラ拡張機能を使えます。

# include <Siv3D.hpp> // OpenSiv3D v0.6.6

void Main()
{
	int32 argc = __argc;

	char** argv = __argv;

	Print << argc;

	for (int32 i = 0; i < argc; ++i)
	{
		Print << Unicode::Widen(argv[i]);
	}

	while (System::Update())
	{

	}
}

既存のさまざまなコマンドライン引数解析ライブラリと連携しやすいよう、 Siv3D では argcargv を返すような関数を v0.6.7 で提供したいと思います。

上記でほとんどのユースケースをカバーできると思うので、 Siv3D 自体で何らかの引数解析を行う機能を提供することは見送ります。

Reputeless avatar Mar 17 '23 08:03 Reputeless

開発中の v0.6.7 にコマンドライン引数を直接取得する関数を追加しました。ご提案ありがとうございました。

  • #964
# include <Siv3D.hpp> // OpenSiv3D v0.6.7

void Main()
{
	int32 argc = System::GetArgc();

	char** argv = System::GetArgv();

	Print << argc;

	for (int32 i = 0; i < argc; ++i)
	{
		Print << Unicode::Widen(argv[i]);
	}

	while (System::Update())
	{

	}
}

Reputeless avatar Mar 18 '23 09:03 Reputeless