所以我正在编写这个简单的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条件而不会进入实际函数,并且会立即跳到内部的内容有条件的。
为什么我的函数调用不起作用?
答案 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)
,您应该能够看到,在此更改后,您的断点将适用于您:)