2012-03-16 6 views
1
int _tmain(int argc, _TCHAR* argv[]) 
{ 

    if (argc != 3) { 
     printf("Format is straightline.exe <EO records file> <output file>"); 
     return 1; 
    } 
    string eoPath = string(__argv[1]); 
    //...other stuff ... 
} 

__argc == 3の場合、__argvはどのようにNULLポインタになりますか?Visual Studio C++ 2010 __argvはどのようにしてNULLポインタになりますか?

私のデバッガは、私は__argv[1]を参照しようとしていた(と私は__argc == 3ことを確認した)ときに、プログラムがクラッシュした後__argv0x00000000を指していることを私に語っています。これは最小限のプログラムであり、私は何らかの処理を行う前に最初に起こっていました。

+1

私はちょうどこれを知らないと確信していますが、__argvはどこから来ていますか? – Collin

+3

二重アンダースコアで始まる変数の動作について*これまで保証したことはありますか? –

+0

ねえ、それを指摘してくれてありがとう。実際、私は気づいたときにコードを熟読していました。私は以前は、これらのアンダースコアを標準的な方法として使用する必要がありました。なぜ私は正確に忘れる。不思議なWindows/Microsoft/VisualStudioの不思議と何か関係があります。とにかく、私は非アンダースコアに切り替えてあり、ありがたいことに働いています。 – pete

答えて

2

__argvへのポインタは、Unicode構成でnullになります。

1

__argc__argv/__wargv__envp/__wenvpいうだけで、あなたのmain/wmain/_tmain関数に渡された変数に固執する、あなたはこれらに触れてはならない、CRTの初期化で使用される特殊なグローバルあり、これらが由来しています前述のグローバルであり、正しいことが保証されており、_tmainバリアントのMicrosoftマクロのおかげで、正しい文字エンコーディング(UNICODE対MBCS/ASCII)も使用されます。

+0

'__argc'と' __argv'変数が存在します。 'WinMain()'をエントリーポイントとして使用するプログラムは、 'WinMain()'が渡されないので、 'argv'と' argc'パラメータにアクセスすることができます(http://support.microsoft.com/kb/126571)それらをあなたに。 'main()'関数はもちろん、関数シグニチャでそれらを提供するので、この問題はありません。 –

+0

@Insilico:その記事は** Windows 3.1 **です。コマンドラインを必要とする 'WinMain'ベースのアプリケーションは、' GetCommandLine'を使ってそれを取得する必要があります。 'WinMain'の' lpCmdline'パラメータ) – Necrolis

+1

はい、実際には文書化されていることを示しています。あなたは 'GetCommandLine()'を使うことができますが、引数の配列ではなく文字列全体を提供します。あなたは 'CommandLineToArgvW()'でそれを変換することができますが、これはUnicodeビルドでのみ利用可能です。また、 '__argv'と' __argc'は 'main()'関数に渡されたものですから、まったく同じです。 –

4

これがユニコードに準拠している場合、__argvはヌルになりますが、__wargvには希望するものが含まれます。私は、__targvには、unicodeやasciiにかかわらずコマンドライン引数を含めるべきだと考えています。

なぜ、これらのうちのどれを使用すれば、argvを_tmainのパラメータとして渡すことができますか?

関連する問題