因此,我正在编写此简单的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)
更改为,您应该可以看到,在进行此更改之后,您的断点将为您工作:)