因此,我正在编写此简单的CLI工具,并且不必太冗长乏味地编写代码,基本上就是这样:

bool IsThing()
{
    // stuff goes here
    return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
    bool IsThing_ = IsThing();
    if ( IsThing_ )
    {
        printf( "foo\n" );
        return 1;
    }

    return 0;
}


运行此代码时,我明确尝试使IsThing()失败,甚至删除了return false以外的所有内容。但是,每一次,我都会得到1的返回码。

为了进行调试,我在IsThing()主体中调用断点之前将断点放置在_tmain()中。最让我沮丧的是,在IsThing()的断点处,VS会告诉我


  没有可执行代码与此行相关联。


当我单步执行main函数时,它直接进入bool IsThing_ = IsThing();,然后检查if条件,而无需进入实际函数,而将立即跳至条件内部。

为什么我的函数调用不起作用?

最佳答案

您正在使用很有可能使用/O1 or /O2 optimization的Release配置进行编译,这是为了使您的代码更快,更小。这意味着在编译过程中此功能:

bool IsThing() { return false; }


被内联,导致您的main等效于:

int _tmain(int argc, _TCHAR* argv[])
{
    bool IsThing_ = false;
    if ( IsThing_ )
    {
        printf( "foo\n" );
        return 1;
    }
    return 0;
}


甚至可能省略if语句的正文,这将导致:

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}


这也是使用Debug配置为您工作的原因。您可以尝试转到项目属性,然后在C / C ++-> Optimization change Optimization选项下将Disabled (/Od)更改为,您应该可以看到,在进行此更改之后,您的断点将为您工作:)

10-04 14:27