繁体   English   中英

接受void的传递成员函数*

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM