类名由define指令。可能?

时间:2012-03-06 14:28:33

标签: c++ class c-preprocessor

我可以创建一个类并从外部源分配他的名字吗?

例如:

// Something like this
#define ClassName Clients

class ClassName
{
    public:
    ClassName();
};

ClassName::ClassName()
{
    //
}

编辑:我的真实代码 (那样,在DUnit框架的XML输出中,我的测试名称是TestName,而不是DatabaseTest)

#define TestName DatabaseTest

namespace TestName
{
    class TTest : public TTestCase
    {
        public:
        __fastcall virtual TTest(System::String name) : TTestCase(name)
        {
        }
        virtual void __fastcall SetUp();
        virtual void __fastcall TearDown();

        __published:
        void __fastcall t1();
    };

    void __fastcall TTest::SetUp()
    {
    }

    void __fastcall TTest::TearDown()
    {
    }

    void __fastcall TTest::t1()
    {
        CheckEquals(1,0);
    }
}

class TTestName : public TestName::TTest
{

};

static void registerTests()
{
    Testframework::RegisterTest(TTestName::Suite());
}

2 个答案:

答案 0 :(得分:1)

是。预编译在编译之前进行。

您的编译器基本上会看到

class Clients
{
    public:
    Clients();
};

Clients::Clients()
{
    //
}

但你为什么要这样呢?您是否尝试解决一些潜在问题?我确信有更好的方法。

答案 1 :(得分:1)

尽管绝对不推荐,但这是可能的。 C(或C ++)预处理器用指定的定义值替换它们可以使用的任何名称,而不用考虑它们的含义。毕竟,它们只是预处理器。

所以,假设你有这个头文件:

generic_class.h

class ClassName
{
    public:
    ClassName()
    {
        //
    }
};

您可以像这样获得此类的多个实例:

#define ClassName Server
#include "generic_class.h"
#undef ClassName

#define ClassName Clients
#include "generic_class.h"
#undef ClassName

请注意,您不应该在标题中添加警戒。

这段代码当然很糟糕。