[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: [MD:4936] Re: Visual C++ Toolkit 2003



>>>>> On Wed, 21 Apr 2004 13:02:58 +0900, あべ == ABE Yasushi wrote,

あべ> ふむふむ。
あべ> で、調べてみたらstdargvに改名されたようです。

あべ> PSDKにsetargv.cのソースがありましたが、stdargv.cをincludeしてるだけで
あべ> した。で、stdargv.objはlVCToolkitのlibc.libにあるようです。

詳細をいえば微妙に違うのですがそれはちょっとトリッキーでMSC固有な事情な
ので説明は割愛しますが、末尾に例を挙げておきます。

結局のところ、VC toolkit でワイルドカード展開展開をするには

1. psdk からstdargv.c を持って来て使う

2. void _setargv (void) { __setargv(); }
   という内容のstdargv.c を作って使う

3. meadow のmain.c 辺りに void _setargv (void) { __setargv(); }
   なんてな関数を追加し、setargv.obj とのリンクは止める。

あたりが選択可能でしょう。どれもやってることのミソは全く一緒で、記述する
場所を変えてるだけの違いです。Makefile の作り方やらMSVC固有要素の排除の
仕方から選ぶ選択肢として3種挙げて見ました。

あと__setargv() を呼べば良い、というのはMSVC固有の話なのでその考慮が必要
でしょう。BCC もほぼ同じだと思いますが調べてないです。


あべ> # *.lib ってcygwinのarで扱えるんですね〜

# へぇ〜、知らんかった


おまけ:

下の argvtest.c を2つの方法でコンパイルした結果を見るとわかると思いますが、
_setargv()という関数を、libc にあるものを使うか、別のものを与えるか、
でワイルドカード展開の可否を選択するメカニズムなのです。

方法1 :  cl argvtest.c
方法2 :  cl /DWILD argvtest.c

実行:  argvtest c:\windows\*.dll
       として両者の実行結果を見てみてください。


--- argvtest.c ---
#include <stdio.h>

int
main (int argc, char **argv)
{
	int i;
	printf ("argc=%d\n", argc);
	for (i=0; i<argc; i++)
		printf ("argv[%d] = '%s'\n", i, argv[i]);
	return 0;
}

#ifdef WILD
void
_setargv (void)
{
	printf("_setargv()\n");
	__setargv();
}
#endif
--- end of argvtest.c ---

--- Regards,
 Shun-ichi Goto  <gotoh@xxxxxxxxxxx>
   R&D Group, TAIYO Corp., Tokyo, JAPAN