c++ - 传递接受 void * 的成员函数

标签 c++ pointers parameters casting member

我正在编写需要将成员函数指针发送到接受 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 来说却不同。

你能想出另一种方法来让它发挥作用吗?

References

最佳答案

不,你不可能做到这一点。标准禁止将指向成员的指针转换为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/

相关文章:

Perl GetOpt::Long 带有可选参数的多个参数

c# - 是否可以使抽象方法的参数列表具有可覆盖的长度和类型?

c++ - 1455行上的 vector 下标超出范围?

c++ - 为什么我的程序在 1 个线程上比在 8.C++ 上运行得更快

c++ - 使用左右参数覆盖运算符

c - 反转数组

c - 迭代指针与字符数组

c++ - If 语句 - 不正确的评估

c - 为什么我必须返回指针?

unit-testing - phpunit 模拟期望因方法名称相等而失败