質問

メインの引数を使用せずに、コマンドライン引数にアクセスする方法はありますか?私は別の関数でそれにアクセスする必要がある、と私はそれを渡していない好むだろう。

私は必ずしもGCCとMac OSおよびLinux上で動作するソリューションを必要とします。

役に立ちましたか?

解決

私はあなたが、それは主に移植不可能または可能性未定義の動作になると、それをハッキングによって行動を操作しようとしない、引数を準備し、int argc, char **argvを介して主にそれを渡しますCランタイムとしてそれをやるべきだと思いません! !ルールに固執すると、あなたは...それを壊す以外にそれを行うための他の方法は移植性を持っていないだろう...

他のヒント

私はMacOSの上でどのように行うのか分からないが、私は私がここで説明しますトリックは、クロス読書のビットとのMacOSに移植することができます疑います。

Linux上で、あなたは(と呼ばれている)(メインの前に)プログラムinitilization時に呼び出される関数を登録するために、ELFバイナリのいわゆる「.init_array」セクションを使用することができます。この関数は、正常なmain()関数と同じシグネチャを有し、それは「ボイド」を返すexecept。 したがって、あなたは覚えているか、プロセスの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:このコードはまた、ライブラリに入れることができるので、それはあなたのケースに合わせなければなりません。 valgrindのは、新しいプロセスをforkしない、これはオリジナルのvalgrindのコマンドラインを示すの/ proc /自己/ cmdlineをになります。

- それも、あなたのprgramはvalgrindのを使用して実行されている場合、動作します。

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

あなたがしたい場合は、グローバル変数にコピーすることができます。

グローバルコンストラクタで例えば - - などそれ以外の場合だあなたがのargc / argvのの前に/proc/self/cmdlineが必要な場合は、

Linuxでは、あなたはこれが唯一必要とされる((その/procと仮定すると存在している)main()を開き、手動で解析することができますより良い)グローバルVARSを経由して、それらを渡すます。

その他のソリューションがここにあります:<のhref = "http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/" のrel = "nofollowを"> http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/ の

うん、それは総および移植不可能ですが、あなたは現実的な問題を解決している場合は、あなたが気にしないことがあります。

することができます。ほとんどのプラットフォームでは、__argcと__argvグローバル変数を提供しています。しかし、再び、私はzneakさんのコメントをサポートしています。

P.S。それらを解析するために、ブースト:: program_optionsを使用してください。 C ++で、それを他の方法をしないでください。

すでに消費された空間へのポインタを渡すことはとても悪いですなぜ、いくつかの理由がありますか?あなたは、問題の関数の引数をなくすのうち、いずれかの実際の貯蓄を取得されることはありません、あなたは花火の興味深いディスプレイをオフに設定することができます。創造牛車とメインの周りに幅木()のコールスタックは、通常、未定義の動作、またはコンパイラ特有の行動への依存で終わります。どちらも、それぞれの機能性と移植性のために悪いです。

の引数にのポインタの問題の引数は覚えておいてください、彼らはあなたが何でスペースを消費しないしようとしています。それらの指標の利便性がはsizeof(int型)と同じくらい安いです、私はそれを使用していない何らかの理由が表示されません。

あなたは、むしろ積極的に時期尚早の最適化されているように聞こえる、またはあなたが本当に台無しにしたくないコードに機能を追加することで立ち往生しています。いずれの場合も、従来は物事をすることは、時間と手間を節約します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top