【发布时间】: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