【问题标题】:C++ Macro ConcatenationC++ 宏连接
【发布时间】:2015-02-03 03:19:05
【问题描述】:

我在理解 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:语法错误:缺少 ';'在“案例”之前

错误 C2039:“x”:不是“ClassA”的成员

错误 C2039:“x”:不是“ClassB”的成员

错误 C2039:“x”:不是“ClassC”的成员

【问题讨论】:

  • 请不要给出带有错误描述的分类代码块。给出一个可靠、完整的 MCVE 并带有确切的编译器错误。
  • 你为什么要这样做?您基本上已经使用switch 语句和类型代码重新实现了虚函数调度?
  • 我有充分的理由使用这个设计,而且上下文与问题完全无关,这就是我使用这个例子进行简化的原因。
  • 不喜欢使用宏,尤其是这种方式。必须有更好的方法,例如模板或设计更改。宏是邪恶的。

标签: c++ macros concatenation


【解决方案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;          \
}     

【讨论】:

  • 我添加了休息时间,我猜这首先是你的意图。
猜你喜欢
  • 1970-01-01
  • 2015-08-02
  • 2017-08-18
  • 1970-01-01
  • 2011-07-12
  • 2013-10-21
  • 2013-08-15
  • 2017-08-27
相关资源
最近更新 更多