c - 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 = (*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。

最佳答案

  1. IN 和 OUT 最有可能指示参数的方向。它们可以用作用户或第三方工具的文档,或者它们可以提示编译器以帮助优化。无论如何,这些都是不可移植的,您必须考虑它们是否值得使用。

  2. 调用约定决定了函数参数的传递方式、返回值的传递方式以及函数调用结束后在何处进行清理。您显然不能混合不同的调用约定,这就是编译器所提示的。调用约定也不是很便携,因此您不应指定它,除非您有充分的理由这样做。

关于c - typedef 一个函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26754370/

相关文章:

c - C 编程中的头文件 (.h) 创建

c++ - 如何检查从哪里引用函数

c++ - 在 C 或 C++ 中处理循环依赖的最佳方法?

c++ - 为什么获取成员函数的地址需要 & 运算符而不是全局函数?

c# - 泛型 C# 的重载运算符

c++ - typedef 模板类错误

c - 从驱动程序写入事件日志

c++ - 使用函数指针?

c - C 中的指针和 typedef

c++ - 如何在自己的定义中缩写类名?