就下面的代码而言,我有两个可能很简单的问题:
#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头文件中定义。如果省略标题,代码将挂起。
2)如果我将__cdecl
调用约定更改为__stdcall
,编译器会强调&my_int_func
并输出错误消息“错误:类型为”int(*)的值(int x)“不能用于初始化”FOO“类型的实体。我的问题是为什么?
我使用的是MS Visual Studio Ultimate 2013。
答案 0 :(得分:2)
IN和OUT很可能是参数方向的指示。它们可以作为用户或第三方工具的文档,也可以提示编译器以帮助优化。在任何情况下,这些都不是便携式的,你必须考虑它们是否值得使用。
调用约定确定函数参数的传递方式,返回值的传递方式以及函数调用结束后清理的位置。你显然不能混合不同的调用约定,这就是编译器所抱怨的。调用约定也不是很容易,因此你不应该指定它,除非你有充分的理由这样做。