Visual studio 2010 win32中的argc不正确(此外,参数被忽略)

Visual studio 2010 win32中的argc不正确(此外,参数被忽略),visual-studio-2010,winapi,command-line-arguments,commandargument,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];

我在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时,我得到错误日志路径CXX0017:错误:未找到符号“logPath”
当然,我已经将vs中的命令参数设置为“abc”(不带引号)

可能是什么? 运行简化程序: //test.cpp:定义控制台应用程序的入口点。 //

#包括“stdafx.h”
#包括“stdafx.h”
#包括
#包括
#包括“conio.h”
int _tmain(int argc,_TCHAR*argv[]
{
断言(argc==4);
LPCTSTR inputPath=argv[1];
LPCTSTR sharedName=argv[2];
LPCTSTR logPath=argv[3];
_getch();
}
产生相同的结果。调试器只是跳转到getch行,如果我尝试添加watch,就会得到logPath cx0017:Error:symbol“logPath”not found
inputPath CXX0017:错误:未找到符号“inputPath”
sharedName CXX0017:错误:找不到符号“sharedName”

当在发布模式下调试这个程序时,它跳过它,当在变量名上方胡闹时,什么也不会发生。右键单击一个变量并选择Add Watch时,我得到错误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();
}
#包括“stdafx.h”
#包括
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
断言(argc==4);
LPCTSTR inputPath=argv[1];
LPCTSTR sharedName=argv[2];
LPCTSTR logPath=argv[3];
OutputDebugString(inputPath);
OutputDebugString(sharedName);
OutputDebugString(日志路径);
_getch();
}

出于好奇,您为什么要在realease模式下调试?因为在调试模式下它可以工作,而外部vs不可以,我不知道为什么。您能否提供更多详细信息,说明您观察到的程序在调试模式和外部vs之间的行为有什么不同?
断言(argc==4)
是一种完全不合适的故障模式<代码>断言应用于逻辑错误,而不是运行时错误。该程序在vs中以调试模式工作,但在使用它们的“真实”程序中不能在外部工作。它可以在VS中的调试模式下工作,但不能在外部工作。变量当然是被使用的…@user这就是为什么大多数人在他们的问题中发布他们正在使用的实际代码。现在,如果我在调试模式下运行vs程序,它不会工作,但是如果我在调试模式下调试它(进入),它会工作!那我怎么调试呢?
#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();
}