C++ 调试与发布

C++ 调试与发布,c++,C++,我有以下代码: #pragma optimize("", off) DG704API_API bool DIG704IsUSBEx(IN BYTE rack) { volatile bool retVal(true); try { // Validate rack if ((rack < 1) || (rack > gpData.num70X)) { OutputDebugMsg(DBG_ERROR_LEVEL, "DIG704IsUS

我有以下代码:

#pragma optimize("", off)

DG704API_API bool DIG704IsUSBEx(IN BYTE rack)
{
volatile bool retVal(true);

  try
  {
    // Validate rack
    if ((rack < 1) || (rack > gpData.num70X))
    {
      OutputDebugMsg(DBG_ERROR_LEVEL, "DIG704IsUSBEx: rack out of hardware range");
      throw (ERROR_INVALID_RACK);  // Throw rack error
    }

    // The DIG-704s should always be first in the list
    if (rack <= ((BYTE)gpData.num704))
      retVal = false;               // We are a DIG-704 so return false

    if (retVal)
      OutputDebugMsg(DBG_INFO_LEVEL, "Rack %d is a DIG-705", rack);
    else
      OutputDebugMsg(DBG_INFO_LEVEL, "Rack %d is a DIG-704", rack);
  }
  catch(int error)
  {
    retVal = false;
  }

  return (retVal);
}

#pragma optimize("", on)
在调试模式下,如果卡是DIG-704,则返回false。在释放模式下,如果卡是DIG-704,则返回true

在我使用的软件/硬件中,我有一个DIG-704。 机架=1 gpData.num704=1

它应该返回false,但是当我查看返回的值时,它是true,当我逐步遍历代码时,它跳过retVal=false行;没有引发任何异常

gpData是一种数据结构,对整个程序来说是有效的全局数据结构。num704被声明为int

我的第一个猜测是代码正在优化,所以我尝试关闭优化,但添加pragma和volatile没有任何影响


我不知道下一步要尝试什么。

问题不在于函数。问题在于调用函数的Pascal代码。对于函数声明,我有:

函数DIG704IsUSBExrack:BYTE:Bool;cdecl;外部“DG704API.dll”

它必须是:

函数DIG704IsUSBExrack:BYTE:Boolean;cdecl;外部“DG704API.dll”

我想我没有为任何人提供足够的信息来回答这个问题。我尽了最大努力,但我不认为Pascal是问题所在,因为当我在Release模式下遍历函数时,我看到它只是跳过了代码


感谢所有试图提供帮助的人。

我的第一个猜测是初始化。在调试模式下,内存将填充一个值。在发行版中,它不是并且应该被视为随机垃圾值,尽管操作系统可能会将添加到进程中的所有新内存归零,这与调试填充非常不同。然而,调试和发布之间可能还有许多其他的区别。缺少必要的内容和对我们所讨论的环境类型的一些解释。从CamelCase和pragma的自由应用来看,我怀疑VisualStudio,我猜DIG-704指的是某种硬件?什么是volatile bool retValtrue;?你用的是什么工具链?您是否比较了DIG704IsUSBEx的程序集(有优化和没有优化)?gpData是否标记为volatile?我相信对于任何不包括猜测的帮助,您必须包含更多的代码上下文。我希望我们无法访问您正在使用的任何硬件,但我认为提供的代码量还不够。