![](/img/trans.png)
[英]Passing a pointer to a member function as argument for a void* function
[英]Passing member function that accepts void *
我正在处理需要将成员函数指针发送到接受void *作为参数的logger方法的代码。 我无法从void *更改它。 我也不能使用c ++ 11。 有没有办法让它正常工作而没有任何警告。 例如:
logger.h
#ifndef _LOGGER_H
#define _LOGGER_H
void logger( void *func );
#endif /* _LOGGER_H */
logger.cpp
#include <cstdio>
#include "logger.h"
void logger( void *func )
{
printf("%lx\n", (unsigned long)func);
}
testCase.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来说却有所不同。
您能想到另一种方法来使其工作吗?
不,您无法实现。 Standard禁止将指向成员的指针转换为void*
。 原因是它们与void*
不兼容-它们通常是void*
两倍。
您的代码也有其他问题,例如, (unsigned long)func
正在将void*
转换为unsigned long,并且这也是未定义的。 例如,在许多系统上,long的长度为32位,而void*
长度为64位。 为了可靠地将void*
转换为整数类型,您需要使用uintptr_t
(前提是您的实现具有此功能)。
我不知道“加倍大小”; 指针是指针,据我所知,给定系统上的所有指针的大小相同,无论它们指向什么。
但是,请看我的Stroustrup撰写的《 C ++编程语言,第三版》(第101页):
应该怀疑系统的较高杠杆处是否存在
void*s
,因为它们可能是设计错误的指标。 在用于优化的地方,可以将void*
隐藏在类型安全接口(第13.5节,第24.4.2节)的后面。不能将指向函数(§7.7)的指针和指向成员(§15.5)的指针分配给
void*s
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.