-4

假设以下头文件:

#ifndef TEST_HEADER
#define TEST_HEADER 

class myFoo
{
    public:
    myFoo(unsigned long *ulbaz):
    baz(ulbaz)
    {
      *baz++;
    }
    ~myFoo()
    {
      *baz--;
    }
    private:
        unsigned long *baz;
    };

#define DEFINE_A( a ) myFoo bar( a);
#define DEFINE_B( b ) 

#endif  // test_header

代码示例:

// code.cpp

#include "test.h"
unsigned long mylong = 0L;


int main()
{
    DEFINE_A( &mylong);
    DEFINE_B( &mylong);
}

如您所见,DEFINE_B为空。我不明白的是:每次DEFINE_B被调用时,我都会从 进入析构函数myFoo,我可以在调用堆栈中看到 - 那怎么可能?据我所知,一个空的define扩展为;.

编辑:此代码现在有效。

4

3 回答 3

2

我假设您正在运行以下主程序:

int main (int argc, char const* argv[])
{
    unsigned long mylong = 0L;
    DEFINE_A( &mylong);
    DEFINE_B( &mylong);
    return 0;
}

该行DEFINE_B( b )扩展为空,您会看到类的析构函数,myFoo因为当到达作用域的末尾时,在其中创建的所有对象都会通过调用它们的析构函数来删除。

于 2013-08-28T12:41:11.783 回答
1

这是由于对象超出范围造成的。想象一下下面的例子,它将证明这一点:

#include <iostream>

#define EXAMPLEMACRO

class Test {
public:
    Test() {}
    ~Test() {}
}

int main() {

    //Open a new scope
    {
        EXAMPLEMACRO //This doesn't do anything!
        Test t();
        EXAMPLEMACRO //This called the destructor?
    }

    return 0;
}

它不会调用析构函数,它只是您的对象超出范围。

于 2013-08-28T12:38:09.817 回答
0

这一行:

DEFINE_B( &mylong);

会变成这段代码。换句话说,那条线上根本不会发生任何事情。

于 2013-08-28T12:37:10.613 回答