【问题标题】:incorrect argc in win32 (in addition, the arguments are ignored)win32 中的 argc 不正确(此外,参数被忽略)
【发布时间】:2012-05-11 19:09:40
【问题描述】:

我在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: Error: symbol "logPath" not found
当然,我已将 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: Error: symbol "logPath" not found
inputPath CXX0017:错误:找不到符号“inputPath”
sharedName CXX0017:错误:找不到符号“sharedName”

【问题讨论】:

  • 只是好奇,你为什么要在realease模式下调试?
  • 因为在调试模式下它可以工作,而在外部与它没有,我不知道为什么。
  • 您能否提供更多详细信息,说明您观察到程序在调试模式和外部 VS 之间的行为有何不同?
  • assert(argc == 4) 是一种完全不合适的故障模式。 assert 应该用于逻辑错误,而不是运行时错误。
  • 程序在vs中以调试模式工作,但在外部不工作

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


【解决方案1】:

在发布模式下调试这个程序时,它会跳过它,当悬停在变量名上方时,什么也没有发生。右键单击变量并选择 Add Watch 时,出现错误 logPath CXX0017: Error: symbol "logPath" not found

这些症状是有道理的。 “发布”模式告诉编译器打开优化,因为你从不使用你声明的变量,编译器有助于将它们完全优化出来。如果您永远不会再使用它,那么进行创建和分配某些东西的动作是没有意义的。

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

另一方面,“调试”模式会禁用优化。因此,它经历了创建这些变量并为它们分配值的动作,即使您可能永远不会使用它们。这就是调试模式的重点——因此您可以在不受编译器优化行为干扰的情况下调试您的应用程序,即使它还没有完全编写完成。

如果您希望通过启用优化(即在“发布”模式下)使其按预期工作,那么您可以简单地使用您分配的变量的值。这将阻止编译器优化它们。例如,您可以简单地将字符串输出到调试器:

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

【讨论】:

  • 在“真实”程序中使用它们。它在 VS 中以调试模式工作,但在外部不工作。变量当然是用的……
  • @user 这就是为什么大多数人会发布他们在问题中使用的实际代码。
  • 现在如果我在调试模式下运行程序,它就不起作用,但是如果我在调试模式下调试它(步入)它确实工作!那我该如何调试呢?
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
相关资源
最近更新 更多