我正在编写需要将成员函数指针发送到接受 void * 作为参数的记录器方法的代码。我无法将其从 void * 更改。我也不能使用c++11。有没有办法让它在没有任何警告的情况下工作。例如:
记录器.h
#ifndef _LOGGER_H
#define _LOGGER_H
void logger( void *func );
#endif /* _LOGGER_H */
记录器.cpp
#include <cstdio>
#include "logger.h"
void logger( void *func )
{
printf("%lx\n", (unsigned long)func);
}
测试用例.cpp
#include "logger.h"
class myClass
{
public:
void testCase( void );
};
void myClass::testCase( void )
{
/* This works on my compiler, but gives warning */
/* warning: converting from 'void (myClass::*)()' to 'void*' */
/* I know this is bad and wrong. */
logger((void *)&myClass::testCase);
/* This compiles without warning */
/* But doesnt work the way I need, gives ffff*/
void (myClass::*ptr)( void ) = &myClass::testCase;
void *m_ptr = ptr;
logger(m_ptr);
}
logger.h 和 logger.cpp 无法更改。
这是在 VxWorks 上运行,我需要在符号表中查找地址。当我尝试第二种方法时,我得到了 ffff。虽然我在使用其他编译器时得到了真实的地址,但对于 VxWorks 来说却不同。
你能想出另一种方法来让它发挥作用吗?
最佳答案
不,你不可能做到这一点。标准禁止将指向成员的指针转换为void*
。其原因是它们与 void*
不兼容 - 它们通常是 void*
大小的两倍。
您的代码还有其他问题,例如,(unsigned long)func
正在将 void*
转换为 unsigned long,这也是未定义的。例如,在许多系统上,long 的长度为 32 位,而 void*
的长度为 64 位。要可靠地将 void*
转换为整数类型,您需要使用 uintptr_t
(前提是您的实现具有它)。
关于c++ - 传递接受 void * 的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36038286/