在文件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情况下解释编译器的问题吗?
答案 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的指针 另一种类型的功能又回来了;结果应该比较 等于原始指针。 如果使用转换的指针进行调用 一个类型与指向类型不兼容的函数 行为未定义。