Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将函数引用转换为char*并返回_C++_C - Fatal编程技术网

C++ 将函数引用转换为char*并返回

C++ 将函数引用转换为char*并返回,c++,c,C++,C,我需要将函数引用存储为char*,然后只使用char*调用该函数 我正在寻找类似于: char* funcRef = (char*)myFunc; //... (void (*funcRef)())(); 你是怎么做到的?(注意:我不是在问如何通过引用调用函数,只要有可能将对函数的引用存储为char*,然后再将其转换回来)不允许这种转换。第6.3节“转换”小节第6.3.2.3小节“指针”给出了允许的转换,其中第(6)和(8)段适用于函数指针 任何指针类型都可以转换为整数类型。除非前面指定,否则

我需要将函数引用存储为char*,然后只使用char*调用该函数

我正在寻找类似于:

char* funcRef = (char*)myFunc;
//...
(void (*funcRef)())();

你是怎么做到的?(注意:我不是在问如何通过引用调用函数,只要有可能将对函数的引用存储为char*,然后再将其转换回来)

不允许这种转换。第6.3节“转换”小节第6.3.2.3小节“指针”给出了允许的转换,其中第(6)和(8)段适用于函数指针

  • 任何指针类型都可以转换为整数类型。除非前面指定,否则结果是实现定义的
  • 指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应与原始指针进行比较。如果使用转换的指针调用类型与指向类型不兼容的函数,则行为未定义
  • 函数指针和对象指针之间的转换不在允许列表中;因此,这是不允许的


    有些系统中指向函数的指针和指向对象的指针是不可互换的。最明显的情况是函数指针的大小与对象指针的大小不同,例如哈佛体系结构,或紧凑型或中型型号的8086。

    不允许这种转换。第6.3节“转换”小节第6.3.2.3小节“指针”给出了允许的转换,其中第(6)和(8)段适用于函数指针

  • 任何指针类型都可以转换为整数类型。除非前面指定,否则结果是实现定义的
  • 指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应与原始指针进行比较。如果使用转换的指针调用类型与指向类型不兼容的函数,则行为未定义
  • 函数指针和对象指针之间的转换不在允许列表中;因此,这是不允许的


    有些系统中指向函数的指针和指向对象的指针是不可互换的。最明显的情况是函数指针的大小与对象指针的大小不同,例如哈佛体系结构,或紧凑型或中型的8086。

    代码无法工作的原因是
    char*
    指针不是函数指针。不能像调用函数一样调用
    char*
    。在将该指针用作函数指针之前,需要将其强制转换回函数指针

    请注意:这是否能正常工作完全取决于编译器和系统。

    C标准中没有任何关于将指向函数的指针转换为指向对象的指针的内容,反之亦然。这是未定义的行为。另一方面,POSIX标准要求兼容的实现必须能够将指向void的指针转换为指向函数的指针。(注:不需要反向功能。)

    这个问题也被标记为C++。在C++11之前,将指向函数的指针转换为指向对象的指针(反之亦然)是非法的。编译器必须发出诊断消息。在符合POSIX的系统上,编译器将发出诊断,然后生成符合POSIXly的目标代码。在C++11及更高版本中,有条件地支持在指向函数的指针和指向对象的指针之间进行转换,或者相反

    有了这些注意事项,下面的代码可以在我的POSIX兼容机器上使用,并且有多个编译器。它是否能在带有非POSIX投诉编译器的非POSIX兼容机器上工作还不得而知

    C++版本:

    #include <iostream>
    
    int sqr (int k) { return k*k; }
    
    int p42 (int k) { return k+42; }
    
    void call_callback(void* vptr, int k)
    {   
        using Fptr = int(*)(int);
        Fptr fun = reinterpret_cast<Fptr>(vptr);
        std::cout << fun(k) << '\n';
    }   
    
    int main ()
    {   
        call_callback(reinterpret_cast<void*>(sqr), 2); 
        call_callback(reinterpret_cast<void*>(p42), 2); 
    }   
    
    #包括
    intsqr(intk){返回k*k;}
    intp42(intk){返回k+42;}
    void call_callback(void*vptr,int k)
    {   
    使用Fptr=int(*)(int);
    Fptr fun=重新解释铸件(vptr);
    
    std::cout代码无法工作的原因是
    char*
    指针不是函数指针。不能像调用函数一样调用
    char*
    。在将其用作函数指针之前,需要将该指针强制转换回函数指针

    请注意:这是否能正常工作完全取决于编译器和系统。

    C标准中没有任何关于将指向函数的指针转换为指向对象的指针的规定,反之亦然。这是未定义的行为。另一方面,POSIX标准要求兼容的实现必须能够将指向void的指针转换为指向函数的指针。(注:不需要反向功能。)

    这个问题也被标记为C++。在C++ 11之前,将指针转换为函数指向指针,或者反过来,是非法的。编译器必须发出诊断消息。在POSIX兼容系统中,编译器将发出诊断,然后生成符合位置的目标代码。在C++ 11和以后,转换COVEV。有条件地支持在指向函数的指针和指向对象的指针之间进行rting,反之亦然

    有了这些注意事项,下面的代码可以在我的兼容POSIX的机器上运行,并且有多个编译器

    C++版本:

    #include <iostream>
    
    int sqr (int k) { return k*k; }
    
    int p42 (int k) { return k+42; }
    
    void call_callback(void* vptr, int k)
    {   
        using Fptr = int(*)(int);
        Fptr fun = reinterpret_cast<Fptr>(vptr);
        std::cout << fun(k) << '\n';
    }   
    
    int main ()
    {   
        call_callback(reinterpret_cast<void*>(sqr), 2); 
        call_callback(reinterpret_cast<void*>(p42), 2); 
    }   
    
    #包括
    intsqr(intk){返回k*k;}
    intp42(intk){返回k+42;}
    void call_callback(void*vptr,int k)
    {   
    使用Fptr=int(*)(int);
    Fptr fun=重新解释铸件(vptr);
    
    std::cout为什么不试试呢?这需要5-10分钟。@user31264我试过了,它不起作用,所以现在我在这里问…请写一个简短的代码(abo)