win32中的argc不正确(另外,参数被忽略)

时间:2012-05-11 19:09:40

标签: visual-studio-2010 winapi command-line-arguments commandargument

我在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]; 

行只是被忽略了! 当在发布模式下调试这个程序时,它跳过它,当在变量名称上面移动时没有任何反应。 右键单击变量并选择Add Watch时,我收到错误logPath CXX0017:错误:未找到符号“logPath”
当然,我已将vs中的命令参数设置为“a b 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行,如果我尝试添加watch,我会得到logPath CXX0017:错误:未找到符号“logPath”
        inputPath CXX0017:错误:未找到符号“inputPath”
        sharedName CXX0017:错误:未找到符号“sharedName”

1 个答案:

答案 0 :(得分:4)

  

在发布模式下调试此程序时,它会跳过它,当在变量名称上面移动时没有任何反应。右键单击变量并选择“添加监视”时,出现错误logPath CXX0017:错误:未找到符号“logPath”

这些症状有意义。 “Release”模式告诉编译器启用优化,并且由于您从未使用您声明的变量,编译器可以帮助完全优化它们。如果您再也不会使用它,那么通过创建和分配某些内容的动作毫无意义。

这就是为什么它告诉你没有找到符号,因为它的定义已经过优化。

另一方面,“调试”模式它禁用优化。因此,它会经历创建这些变量并为其赋值的动作,即使您可能永远不会使用它们。这是调试模式的全部要点 - 因此您可以调试应用程序而不受编译器优化行为的干扰,即使它尚未完全编写。

如果您迫切希望在启用优化的情况下使其工作(例如,在“发布”模式下),那么您只需使用您指定的变量的值。这将阻止编译器优化它们。例如,您只需将字符串输出到调试器:

#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();
}