C Typedef函数指针
就以下代码而言,我有两个可能很简单的问题:C Typedef函数指针,c,function-pointers,typedef,C,Function Pointers,Typedef,就以下代码而言,我有两个可能很简单的问题: #include <windows.h>//IN and OUT prefixes are defined here typedef int(__cdecl *FOO)(IN int input); int my_int_func(IN int x) { return x; } int main() { int res = 0; FOO foo = &my_int_func; res = (*fo
#include <windows.h>//IN and OUT prefixes are defined here
typedef int(__cdecl *FOO)(IN int input);
int my_int_func(IN int x) {
return x;
}
int main() {
int res = 0;
FOO foo = &my_int_func;
res = (*foo)(5);
return 0;
}
#include//IN和OUT前缀在这里定义
typedef int(uu cdecl*FOO)(在int输入中);
int my_int_func(在int x中){
返回x;
}
int main(){
int res=0;
FOO FOO=&my_int_func;
res=(*foo)(5);
返回0;
}
这段代码实际上工作得完美无缺。以下是问题:
1) typedef
行中的前缀是什么意思?前缀在windows.h标头中定义。如果省略了头,代码将挂起
2) 如果我将调用约定更改为\uuuuu cdecl
,编译器会在&my\u int\u func
下加下划线,并输出错误消息“error:a value of type“int(*)(int x)”不能用于初始化“FOO”类型的实体。我的问题是为什么
我使用MS Visual Studio Ultimate 2013
输入和输出都是参数方向的最有可能的指示。它们可以用作用户或第三方工具的文档,或者它们可以是编译器的提示,以帮助优化。在任何情况下,这些都是不可移植的,并且必须考虑它们是否值得使用。
调用约定决定了函数参数的传递方式、返回值的传递方式以及函数调用结束后在何处进行清理。显然,您不能混合使用不同的调用约定,这正是编译器所抱怨的。调用约定也不是非常可移植的,因此您不应该指定它,除非你有充分的理由这么做
是C吗?添加语言标记。是的,是的。代码是作为控制台应用程序构建的。IN只是对人类读者的提示,它将扩展为零。如果您将u cdecl更改为u stdcall,请定义my_int_func u stdcall。是的,它工作正常。非常感谢,Alex。第一个问题中的SSCCE。太好了!