我已经读过将函数指针转换为数据指针,反之亦然,但在大多数平台上都可以工作,但不能保证工作.为什么会这样?两者都不应该只是简单地址到主存储器中,因此兼容吗?
我的印象是访问union除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).
那么,这是不确定的行为?
这是我前一个问题的切线跟进.匹配bool vs const void*overload的函数的地址.回答者解释说:
[C++ 11]标准没有定义从"指向函数的指针"到"指向"的任何标准转换
void.没有东西可以提供引用,但我能做的最接近的是C++ 11 4.10/2 [conv.ptr]:
类型为"指向cv的 指针"的prvalue
T,其中T是对象类型,可以转换为类型为"指向cv的 指针"的prvaluevoid.一个"指针转换的结果CVT"发送给"指针CVvoid"指向其中类型的对象的存储位置的起始T驻留,仿佛对象是类型T的最派生对象(1.8)(即,而不是基类子对象).空指针值将转换为目标类型的空指针值.(强调我的)
假设func是声明void func();,如果你进行C风格的演员表,即(void*) func演员表会成功.static_cast<void*>(func)但是无效,但reinterpret_cast<void*>(func)会成功.但是,您无法将后续转换的指针转换回其原始类型.例如,
精细:
int main() {
int* i;
void* s = static_cast<void*>(i);
i = static_cast<int*>(s);
s = reinterpret_cast<void*>(i);
i = reinterpret_cast<int*>(s);
}
Run Code Online (Sandbox Code Playgroud)
不好:
void func() { }
int main() { …Run Code Online (Sandbox Code Playgroud) void*以这样的方式定义,它可以指向任何东西.那么它可以用来指向一个函数(int send())吗?
int send();
void* p = send;
Run Code Online (Sandbox Code Playgroud)
可能吗?当我这样使用时,它没有向我显示错误原因?如果没有,有没有办法将所有指针存储在一个变量中?
我错了以下吗?
C++标准规定,指向函数和指向对象(以及返回)的指针之间的转换是通过实现定义的语义得到条件支持的,而所有C标准都认为这在所有情况下都是非法的,对吧?
void foo() {}
int main(void)
{
void (*fp)() = foo;
void* ptr = (void*)fp;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ISO/IEC 14882:2011
5.2.10重新解释强制转换[expr.reinterpret.cast]
8有条件地支持将函数指针转换为对象指针类型(反之亦然).这种转换的含义是实现定义的,除非实现支持两个方向的转换,将一种类型的prvalue转换为另一种类型并返回,可能具有不同的cvqualification,将产生原始指针值.
我现在在C标准中找不到任何关于它的信息......
这是一些带有中断向量的启动文件摘录。
#pragma DATA_SECTION(interruptVectors, ".intvects")
void (* const interruptVectors[])(void) =
{
(void (*) (void))((uint32_t)&__STACK_END),
resetISR,
nmi_ISR,
fault_ISR,
... /* More interrupt vectors */
Run Code Online (Sandbox Code Playgroud)
void (* const interruptVectors[])(void)- 是一个函数指针数组,必须包含函数名称,但我无法理解(void (*) (void))((uint32_t)&__STACK_END)语法。
(void (*) (void))看起来像一个指向函数的指针,该函数不返回任何内容,没有参数,也没有任何名称。是否可以?
(uint32_t)&__STACK_END是一个指针。还有为什么函数指针和指针放在一起呢?
我想在WaitAndCallFunc()函数中调用Test1()方法.
码:
typedef void (*func)();
void StartTimer(void* pFuncAddr);
void WaitAndCallFunc(void* pPtr);
void WaitAndCallFunc(void* pPtr)
{
int i = 0;
int nWaitTime = 3;
while(1)
{
Sleep(1000);
// I want pPtr to call Test1 Function;
if(i == nWaitTime)
break;
}
_endthread();
}
void StartTimer(void* pFuncAddr)
{
_beginthread(WaitAndCallFunc, 0, pFuncAddr);
}
void Test1();
int main(int argc, char* argv[])
{
StartTimer(Test1);
Sleep(5000);
return 0;
}
void Test1()
{
cout << "Testing Thread\n";
}
Run Code Online (Sandbox Code Playgroud)