Typedef一个函数指针

时间:2014-11-05 10:07:13

标签: 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 = (*foo)(5);
    return 0;
}

代码实际上完美无瑕。以下是问题:

1)IN行中typedef前缀的含义是什么?前缀在windows.h头文件中定义。如果省略标题,代码将挂起。

2)如果我将__cdecl调用约定更改为__stdcall,编译器会强调&my_int_func并输出错误消息“错误:类型为”int(*)的值(int x)“不能用于初始化”FOO“类型的实体。我的问题是为什么?

我使用的是MS Visual Studio Ultimate 2013。

1 个答案:

答案 0 :(得分:2)

  1. IN和OUT很可能是参数方向的指示。它们可以作为用户或第三方工具的文档,也可以提示编译器以帮助优化。在任何情况下,这些都不是便携式的,你必须考虑它们是否值得使用。

  2. 调用约定确定函数参数的传递方式,返回值的传递方式以及函数调用结束后清理的位置。你显然不能混合不同的调用约定,这就是编译器所抱怨的。调用约定也不是很容易,因此你不应该指定它,除非你有充分的理由这样做。