function cast导致gcc abort命令

时间:2013-12-18 11:48:37

标签: c gcc casting function-pointers gcc-warning

在文件func.c中的以下代码中:

#include <stdio.h>

int Myfunc1(int i, int z)
{
    return i;
}

int main()
{
    int ans;

    /*  casting the function into an 'int (int)' function   */
    ans = ((int(*)(int))(Myfunc1))(5);

    printf("ans: %d\n\n", ans);

    return 0;
}

我试图将int(int,int)函数转换为int(int)函数,得到gcc警告并注意:

func.c:13:32: warning: function called through a non-compatible type [enabled by default]
func.c:13:32: note: if this code is reached, the program will abort

当我试图跑步时,我得到:

Illegal instruction (core dumped)

但是如果我使用.cpp以gcc编译器结束编译此文件,它可以正常工作。 任何人都可以在.c情况下解释编译器的问题吗?

3 个答案:

答案 0 :(得分:2)

  

GNU GCC将以下所有内容都识别为C ++文件,无论您是通过gcc还是g ++调用它,都将使用C ++编译:.C,.cc,.cpp,.CPP,.c ++ ,.。ct或。 CXX

来自https://stackoverflow.com/a/1546107/1767861

在这种情况下,gcc用c ++编译它,它似乎接受了演员表。这是为什么 ?见https://stackoverflow.com/a/559671/1767861

答案 1 :(得分:2)

#include <stdio.h>

int Myfunc1(int i, int z)
{
    return i;
}

int main()
{
    // define a function pointer and initialize it to NULL
    int (*ans)(int, int) = NULL;

    // get function pointer from function 'Myfunc1'
    ans = Myfunc1(5, 6);

    // call function using the pointer
    printf("ans: %d\n", (*ans));

    return 0;
}

答案 2 :(得分:1)

问题是Myfunc1的签名,而您尝试将其强制转换为的函数指针属于不兼容的类型。相反,你需要这样做:

ans = ((int(*)(int, int))(Myfunc1))(5, 5);

link Thomas Ruiz发布了解释为什么它是未定义的行为。


总结:

附件J.2

  

在以下情况下,行为未定义:

     

- 指针用于调用类型与指向类型不兼容的函数(6.3.2.3)。

6.3.2.3/8

  

指向一种类型的函数的指针可以转换为指向a的指针   另一种类型的功能又回来了;结果应该比较   等于原始指针。 如果使用转换的指针进行调用   一个类型与指向类型不兼容的函数   行为未定义。