(添加到@bitmask 和@dasblinkenlight 提供的已经有用的信息)
在 C 中,函数原型大致是函数签名的声明,即函数名称、返回类型和参数列表类型的声明(即函数接受的参数类型,按它们各自的顺序)。
因此,从某种意义上说,函数的原型可以被视为函数与客户端代码的接口(在这种情况下,术语接口以一般方式使用,不像它在 OOP 和 Java 中的具体含义)。
作为一个更简单的示例,假设您定义了这样的函数:
int MyFunc( double x, char * z )
{
// function body code
}
那么它的原型将是:
int MyFunc( double x, char * z );
甚至
int MyFunc( double, char * );
因为参数名称在函数原型中是可选的。
尽管程序员经常将特制的 C 头文件称为“接口”,但 C 语言中没有创建与 Java 接口等效的副本的机制。这些头文件充满了函数原型和其他声明,这些声明代表了它们属于客户端代码的库的“接口”。
因此,客户端代码可以#include
在不知道其实现(这里是“接口”的东西)的情况下访问这些头文件来访问库提供的设施,这通常在链接时解决(如果涉及动态链接,则在运行时解决)。
编辑(回答评论)
您在函数名称之前看到的可能是一些宏技巧。由于我不知道上下文是什么,我只能猜测。这两个标识符VisionAPI_RETURN
VisionAPI
很可能被定义为宏。从他们的名字我猜第一个扩展为实际的返回类型,而第二个可能是一个空宏(通常用于标记某些类别的声明)或扩展为一些特定于编译器的关键字组合,通常用于声明函数低级调用约定。
例如,某处可能有这些宏定义:
#define VisionAPI_RETURN int
#define VisionAPI
这样,在预处理器完成其工作后,编译器将看到:
int VisionInterf_ImageAttach(
VisionAPI_HANDLE ImageHandle,
uint32_t NumImages
);
另一个例子 - 如果这些宏是这样定义的:
#define VisionAPI_RETURN struct MyReturn
#define VisionAPI __stdcall
然后原型将像这样扩展:
struct MyReturn __stdcall VisionInterf_ImageAttach(
VisionAPI_HANDLE ImageHandle,
uint32_t NumImages
);
在这种情况下,返回类型将是struct MyReturn
,而__stdcall
关键字将指示“stdcall”调用约定(该__stdcall
关键字由 Microsoft 编译器使用)。这种产生的语法是对标准 C 语法的扩展(许多编译器都有某种这样的扩展)。