C ++宏连接

时间:2014-12-05 02:13:10

标签: c++ macros concatenation

我在理解c ++宏连接方面遇到了一些麻烦。

目前,我有许多类共享同名的静态函数。例如:

ClassA::MyFunc1, ClassA::MyFunc2, ClassA::MyFunc3
ClassB::MyFunc1, ClassB::MyFunc2, ClassB::MyFunc3
ClassC::MyFunc1, ClassC::MyFunc2, ClassC::MyFunc3

我有一个用于根据类型调用静态函数的接口。例如:

ClassInterface::MyFunc1(Type)
{
    switch (Type)
    {
        case TypeA:
        {
            ClassA::MyFunc1();
        }

        case TypeB:
        {
            ClassB::MyFunc1();
        }

        case TypeC:
        {
            ClassC::MyFunc1();
        }
    }
}

这是通过单个接口按类型调用MyFunc1。很明显,如果我有50个类和50个静态函数,那么每次编写它们都会令人沮丧。

我试图写一个宏来节省很多时间。

#define MyMacro(x)      \
    case TypeA:         \
    {                   \
        ClassA::##x;    \
    }                   \
                        \
    case TypeB:         \
    {                   \
        ClassB::##x;    \
    }                   \
                        \
    case TypeC:         \
    {                   \
        ClassC::##x;    \
    }                   

然后像这样使用它:

ClassInterface::MyFunc1(Type)
{
    switch (Type)
    {
        MyMacro(MyFunc1)
    }
}

但是,我收到错误告诉我x(在宏内部)是未声明的标识符。谁能帮我一把?

使用Visual Studio 2013 ...

错误C2065:' x' :未声明的标识符

错误C2143:语法错误:缺少';'在' case'

之前

错误C2039:' x' :不是' ClassA'

的成员

错误C2039:' x' :不是' ClassB'

的成员

错误C2039:' x' :不是' ClassC'

的成员

1 个答案:

答案 0 :(得分:1)

不需要使用concat运算符,也不需要实际调用函数。

将您的宏更改为以下内容:

//EDIT: you probably want some breaks in there
//      otherwise it could call all 3 functions
#define MyMacro(x)      \
case TypeA:         \
{                   \
    ClassA::x();    \
    break;          \
}                   \
                    \
case TypeB:         \
{                   \
    ClassB::x();    \
    break;          \
}                   \
                    \
case TypeC:         \
{                   \
    ClassC::x();    \
    break;          \
}