【问题标题】:Are different function pointers compatible with each other?不同的函数指针是否相互兼容?
【发布时间】:2013-11-26 07:56:52
【问题描述】:

今天了解到,函数指针和数据指针不相同,因此彼此不兼容(Why are function pointers and data pointers incompatible in C/C++?)。然而,我的问题是,不同的函数(非成员)指针是否相互兼容(实现方式相同)。

在代码中:

typedef void(*FuncPtr0)();
typedef void(*FuncPtr1)(int);

FuncPtr0 p0;
FuncPtr1 p1;

p0 = reinterpret_cast<FuncPtr0>(p1);    // will this always work, if p1 really 
p0();                                   // points to a function of type FuncPtr0

感谢您的帮助!

【问题讨论】:

    标签: c++ pointers function-pointers


    【解决方案1】:

    n3376 5.2.10/6

    函数指针可以显式转换为不同类型的函数指针。调用效果 通过指向与定义中使用的类型不同的函数类型(8.3.5)的指针的函数 函数的未定义。除了将“pointer to T1”类型的纯右值转换为“pointer to T2”(其​​中 T1 和 T2 是函数类型)并返回其原始类型产生原始指针值,这种指针转换的结果是未指定的。

    【讨论】:

    • 非常感谢!似乎很容易找到这个问题的答案。请问您,您是如何在标准中找到引用的?
    • @rozina 只看段落,说的是 reinterpret_cast。
    • 我在谷歌上搜索并发现该标准不是免费的,这就解释了为什么没有谷歌搜索结果在 stackoverflow 上只显示该标准:) 再次感谢!
    • @rozina google 关于标准草案。他们是免费的。我的报价来自 n3376 草案。
    【解决方案2】:

    不,它们不兼容并且会调用未定义的行为。您将得到未指定的结果。

    事实上,您可以将它们相互转换,但您不应该调用指向不兼容函数签名的函数指针。 例如,见this code

    typedef void(*FuncPtr0)();
    
    void p1f()      { std::cout << "ONE";        }
    void p2f(int x) { std::cout << "TWO " << x ; }
    
    int main()
    {
        FuncPtr0 p0 = reinterpret_cast<FuncPtr0>(p2f);
        p0();
    } 
    

    输出

    TWO 1
    

    问题是谁将参数 x 设置为 1 ?它可能会运行,但结果未指定。在我的系统中,结果是别的东西(垃圾)TWO 39

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2021-02-26
      • 2016-10-15
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多