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。太好了!