就下面的代码而言,我有两个可能很简单的问题:
#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;
}
该代码实际上可以完美运行。以下是问题:
1) IN
前缀在 typedef
行中是什么意思?前缀在 windows.h header 中定义。如果省略 header ,代码将挂起。
2) 如果我将 __cdecl
调用约定更改为 __stdcall
,编译器会在 &my_int_func
下划线并输出错误消息“Error: a value “int (*)(int x)”类型的实体不能用于初始化“FOO”类型的实体。我的问题是为什么?
我使用 MS Visual Studio Ultimate 2013。
最佳答案
IN 和 OUT 最有可能指示参数的方向。它们可以用作用户或第三方工具的文档,或者它们可以提示编译器以帮助优化。无论如何,这些都是不可移植的,您必须考虑它们是否值得使用。
调用约定决定了函数参数的传递方式、返回值的传递方式以及函数调用结束后在何处进行清理。您显然不能混合不同的调用约定,这就是编译器所提示的。调用约定也不是很便携,因此您不应指定它,除非您有充分的理由这样做。
关于c - typedef 一个函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26754370/