C++ 将函数引用转换为char*并返回
我需要将函数引用存储为char*,然后只使用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* 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)