为什么我的函数从未被调用过,即使我明确地称之为?

时间:2013-03-11 20:16:24

标签: c++ visual-studio-2010 visual-c++ command-line

所以我正在编写这个简单的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会告诉我

  

此行没有可执行代码。

当我单步执行主函数时,它实际上转到bool IsThing_ = IsThing();,然后检查if条件而不会进入实际函数,并且会立即跳到内部的内容有条件的。

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

2 个答案:

答案 0 :(得分:2)

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;
}

在发布模式下,Visual Studio会将此代码转换为:

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

当然,由于不再需要IsThing,因此不会为其生成代码,因此您无法在其中设置断点。

现在,如果你将足够的代码填入实际执行的函数(例如文件I / O)并且不对false的返回进行硬编码,那么编译器确实可能使它成为一个被调用的函数。但是这些天的编译器非常擅长消除不产生任何“有意义”的代码。

我认为这里没有任何神秘之处 - 它只是编译器工作的方式。

答案 1 :(得分:1)

您正在使用最有可能使用/O1 or /O2 optimization发布配置进行编译,这样可以使您的代码更快更小。这意味着在编译期间这个函数:

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 ++ - >优化优化选项更改为Disabled (/Od),您应该能够看到,在此更改后,您的断点将适用于您:)