相关疑难解决方法(0)

为什么函数指针和数据指针在C/C++中不兼容?

我已经读过将函数指针转换为数据指针,反之亦然,但在大多数平台上都可以工作,但不能保证工作.为什么会这样?两者都不应该只是简单地址到主存储器中,因此兼容吗?

c c++ pointers function-pointers

128
推荐指数
10
解决办法
1万
查看次数

访问非活动的union成员和未定义的行为?

我的印象是访问union除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).

那么,这是不确定的行为?

c++ undefined-behavior unions language-lawyer

114
推荐指数
4
解决办法
2万
查看次数

使用reinterpret_cast将函数转换为void*,为什么它不合法?

这是我前一个问题切线跟进.匹配bool vs const void*overload的函数的地址.回答者解释说:

[C++ 11]标准没有定义从"指向函数的指针"到"指向"的任何标准转换void.

没有东西可以提供引用,但我能做的最接近的是C++ 11 4.10/2 [conv.ptr]:

类型为"指向cv的 指针"的prvalue T,其中T是对象类型,可以转换为类型为"指向cv的 指针"的prvalue void.一个"指针转换的结果CV T "发送给"指针CV void "指向其中类型的对象的存储位置的起始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)

c++ pointers language-lawyer c++11

16
推荐指数
1
解决办法
2893
查看次数

can void*用于存储函数指针?

void*以这样的方式定义,它可以指向任何东西.那么它可以用来指向一个函数(int send())吗?

int send();
void* p = send;
Run Code Online (Sandbox Code Playgroud)

可能吗?当我这样使用时,它没有向我显示错误原因?如果没有,有没有办法将所有指针存储在一个变量中?

c c++ function-pointers void-pointers

14
推荐指数
2
解决办法
3079
查看次数

在C和C++中,在指向函数和指向对象之间进行转换

我错了以下吗?

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标准中找不到任何关于它的信息......

c c++

12
推荐指数
4
解决办法
3214
查看次数

什么是 (void (*) (void))((uint32_t)&amp;__STACK_END)?

这是一些带有中断向量的启动文件摘录。

#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是一个指针。还有为什么函数指针和指针放在一起呢?

c c++ syntax interrupt

3
推荐指数
1
解决办法
607
查看次数

如何将地址转换为函数指针到调用方法

我想在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)

c c++ multithreading function-pointers

1
推荐指数
1
解决办法
4894
查看次数