C++ Macro Concatenation

C++ Macro Concatenation

本文关键字:Concatenation Macro C++      更新时间:2023-10-16

我在理解 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":不是"A类"的成员

错误 C2039:"x":不是"B类"的成员

错误 C2039:"x":不是"类 C"的成员

无需使用 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;          
}