9

我有一个以下列方式声明的类:

#ifndef MYCLASS_H
#define MYCLASS_H

class MyClass : public MyOtherClass
{

public:
    MyClass();

    int a() const{ return _a; };
    int b() const{ return _b; };

private:
    int _a;
    int _b;
};

inline bool operator==( const MyClass& lhs, const MyClass& rhs )
{
    return (lhs.a() == rhs.a()) && (lhs.b() == rhs.b());
}

#endif

我的问题是重载中设置的任何断点都operator==不会被命中,Visual Studio 甚至告诉我执行永远不会到达这个函数。我遵循这个经验法则来重载比较运算符,但除了使它们成为非成员之外,它没有提到任何其他内容,所以我不确定我是否错过了运算符重载或内联函数的某些内容。

谁能告诉我为什么我的断点永远不会被击中?

4

3 回答 3

16

您的断点永远不会被命中,因为编译器正在内联代码。在该内联函数中设置断点可能意味着设置数百或数千个“虚拟”断点。跟踪哪些代码被内联在哪里对于 IDE 来说工作量太大了,因此它没有这样做。

为了解决这个问题,要么在调试中运行(我认为内联不会发生),要么不内联函数。

您还可以使用 /Od 标志进行编译以禁用内联以及所有其他优化(这是它在调试中所做的)。

设置 /Ob0 标志应该禁止内联发生。但是,出于性能原因,建议不要经常这样做,因此最好在调试中运行。

于 2012-10-16T09:40:22.550 回答
4

由于 OP 提到他在 VS 中使用调试模式,因此我尝试复制它并且可以复制它。

1>Remove /ZI flag  (no debug infomration) but set it /Zi instead.
2>Disable /Od flag (so no inline) & set it to /Od2.

通过这种方式,您可以添加普通断点,因为它确实被内联,所以无法进入内联函数断点。

所以克里斯威尔逊,你能去你的项目财产并确保你有

1>/ZI flag is set.
2>/Od flag is disabled. 

如果您不知道如何操作,请查看下面的两个 MSDN 链接以获取这两个标志。

http://msdn.microsoft.com/en-us/library/47238hez(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/958x11bc(v=vs.80).aspx

于 2012-10-16T10:16:57.750 回答
0

inline并不意味着函数体将在每个调用站点中内联。实际上,即使没有明确定义,编译器也可以内联函数inline。一个函数可以在一个调用点内联,在另一个调用点正常调用。该指令只是对编译器的提示。Visual Studio 调试器适用于内联函数。

我认为这个问题不是由inline指令引起的。尝试删除此指令并在调试器下运行您的代码。为这样的情况编写单元测试非常方便。

于 2012-10-16T09:51:19.200 回答