我在理解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'
的成员答案 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; \
}