这个问题是我想获取宏中的函数在符号(::
)后面的地址时引起的,总是有一个尾随的空格,报错。
我在 Mac OS Mojave i386 中使用 G++。
例如,我有一个类:
struct A{
void b();
};
还有一个宏:
#define ACC(name) &A::name
我用它来获取 A::b
的指针:
void(*accab)() = ACC(b);
我会得到这样的错误:
error: cannot initialize a variable of type 'void (*)()' with an rvalue of type 'void (A::*)()'
在那之后我试着放一个括号但是我得到了这个:
error: call to non-static member function without an object argument
有什么办法可以解决问题,让指针可以通过宏获取吗?
最佳答案
函数指针的类型不同于成员函数指针的类型。
一般来说,指向任何成员的指针类型都不同于普通指针的类型。
要完成这项工作,您需要将 accab
声明为指向成员的指针:
void(A::* accab)() = ACC(b);
C++ 标准有一个 note关于这个:
The type “pointer to member” is distinct from the type “pointer”, that is, a pointer to member is declared only by the pointer to member declarator syntax, and never by the pointer declarator syntax.
关于c++ - 使用宏的函数访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56167455/