11

mainの引数を使用せずに、コマンドライン引数にアクセスする方法はありますか?別の関数でアクセスする必要があり、渡さない方がいいです。

MacOSとLinuxwithGCCでのみ機能するソリューションが必要です。

4

6 に答える 6

13

MacOSでそれを行う方法はわかりませんが、ここで説明するトリックは、少しクロスリードすることでMacOSに移植できると思います。

Linuxでは、ELFバイナリのいわゆる「.init_array」セクションを使用して、プログラムの初期化中(main()が呼び出される前)に呼び出される関数を登録できます。この関数は、「void」を返すことを除いて、通常のmain()関数と同じシグネチャを持っています。したがって、この関数を使用して、argc、argv []、およびevp[]を記憶または処理できます。

使用できるコードは次のとおりです。

static void my_cool_main(int argc, char* argv[], char* envp[])
{
    // your code goes here
}

__attribute__((section(".init_array"))) void (* p_my_cool_main)(int,char*[],char*[]) = &my_cool_main;

PS:このコードはライブラリに入れることもできるので、あなたのケースに合うはずです。prgramがvalgrindで実行されている場合でも機能します。valgrindは新しいプロセスをフォークしません。これにより、/ proc / self/cmdlineに元のvalgrindコマンドラインが表示されます。

PPS:この非常に初期のプログラム実行中、多くのサブシステムがまだ完全に初期化されていないことに注意してください-libc I / Oルーチンを試しましたが、動作しているように見えますが、それに依存しないでください-グローバル変数でさえまだ構築されていない可能性があります、等...

于 2014-07-13T00:38:03.483 に答える
4

Linuxでは、 (存在すると/proc/self/cmdline仮定して)手動で解析することができます(これは、前に/procargc / argvが必要な場合にのみ必要です-たとえば、グローバルコンストラクターで-そうでない場合は、グローバル変数を介して渡す方が良いです)。 main()

その他のソリューションはこちらから入手できます:http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/

ええ、それはひどくて移植性がありません、しかしあなたが実際的な問題を解決しているならあなたは気にしないかもしれません。

于 2014-01-21T19:12:36.743 に答える
3

必要に応じて、それらをグローバル変数にコピーできます。

于 2010-03-18T16:39:55.477 に答える
2

Cランタイムが引数を準備し、それをメイン経由で渡すので、あなたがそれをすべきではないと思います。int argc, char **argvそれは主に移植できないか、おそらく未定義の振る舞いになるので、ハッキングして振る舞いを操作しようとしないでください!! ルールに固執すれば、移植性があります...それを破る以外の方法はありません...

于 2010-03-18T16:37:53.403 に答える
1

あなたはできる。ほとんどのプラットフォームは、グローバル変数__argcおよび__argvを提供します。しかし、繰り返しになりますが、私はzneakのコメントを支持します。

PSそれらを解析するには、boost::program_optionsを使用します。C++では他の方法でそれを行わないでください。

于 2010-03-18T16:32:06.337 に答える
0

すでに消費されているスペースへのポインターを渡すことが非常に悪い理由はありますか?問題の関数への引数を削除しても実際の節約は得られず、花火の興味深い表示を開始することができます。main()の呼び出しスタックをクリエイティブなハッカーで回避すると、通常、未定義の動作、またはコンパイラ固有の動作への依存になります。どちらも機能性と移植性にそれぞれ悪いです。

問題の引数は引数へのポインタであり、何をしてもスペースを消費することに注意してください。それらのインデックスの便利さはsizeof(int)と同じくらい安いので、それを使わない理由は見当たらない。

かなり積極的かつ時期尚早に最適化しているようです。あるいは、本当に混乱させたくない機能をコードに追加しなければならないことに悩まされているようです。どちらの場合でも、従来通りに物事を行うことで、時間と手間を省くことができます。

于 2010-03-19T02:30:32.110 に答える