-1

私はwin32でコーディングしていましたが、私のプログラムは実際にはvsではデバッグモードで動作しますが、リリースモードではなく、vsの外部でも動作しません。

int _tmain(int argc, _TCHAR* argv[])
{
    //assert that there are 3 parameters.
    assert(argc==4);
    LPCTSTR inputPath = argv[1];
    LPCTSTR sharedName = argv[2];
    LPCTSTR logPath = argv[3];

argcが正しくない場合もあり(300000を超える場合もありますが、4である必要があります)、場合によっては

LPCTSTR sharedName = argv[2]; 

行は無視されます!このプログラムをリリースモードでデバッグするときはジャンプし、変数名の上にカーソルを合わせると何も起こりません。変数を右クリックして[ウォッチの追加]を選択すると、エラーlogPath CXX0017が表示されます。エラー:シンボル "logPath"が見つかりません。
もちろん、vsのコマンド引数を "ab c"(引用符なし)に設定しました。

どうなり得るか?簡略化されたプログラムの実行:// test.cpp:コンソールアプリケーションのエントリポイントを定義します。//

#include "stdafx.h"
#include "stdafx.h"
#include <windows.h>
#include <assert.h>
#include "conio.h"

int _tmain(int argc, _TCHAR* argv[])
{
    assert(argc==4);
    LPCTSTR inputPath = argv[1];
    LPCTSTR sharedName = argv[2];
    LPCTSTR logPath = argv[3];
    _getch();
}

同じ結果が得られます。デバッガーがgetch行にジャンプし、ウォッチを追加しようとすると、logPath CXX0017:エラー:symbol"logPath"が見つかりません
inputPathCXX0017:エラー:symbol"inputPath"が見つかりません
sharedNameCXX0017:エラー:symbol "sharedName"見つかりません

4

1 に答える 1

4

このプログラムをリリースモードでデバッグするときはジャンプし、変数名の上にカーソルを合わせると何も起こりません。変数を右クリックして[ウォッチの追加]を選択すると、エラーlogPath CXX0017:エラー:シンボル"logPath"が見つかりません

これらの症状は理にかなっています。「リリース」モードは、コンパイラーに最適化をオンにするように指示します。宣言した変数は使用しないため、コンパイラーはそれらを完全に最適化するのに役立ちます。二度と使用しないのであれば、何かを作成して割り当てるという動きを経験しても意味がありません。

そのため、定義が最適化されているため、シンボルが見つからないことがわかります。

一方、「デバッグ」モードでは、最適化が無効になります。したがって、これらの変数を使用することは決してないかもしれませんが、これらの変数を作成して値を割り当てるという動作を実行します。これがデバッグモードの要点です。つまり、まだ完全に記述されていない場合でも、コンパイラの最適化動作に干渉されることなくアプリケーションをデバッグできます。

最適化を有効にして(つまり、「リリース」モードで)期待どおりに機能させたい場合は、割り当てた変数の値を使用するだけです。これにより、コンパイラがそれらを最適化できなくなります。たとえば、文字列をデバッガに出力するだけです。

#include "stdafx.h"
#include <windows.h>
#include <assert.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
   assert(argc==4);
   LPCTSTR inputPath  = argv[1];
   LPCTSTR sharedName = argv[2];
   LPCTSTR logPath    = argv[3];

   OutputDebugString(inputPath);
   OutputDebugString(sharedName);
   OutputDebugString(logPath);

   _getch();
}
于 2012-05-11T19:20:53.887 に答える