0

我正在尝试阅读项目文档。在标题Prototype下,我有这个代码:

VisionAPI_RETURN VisionAPI VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle , 
     uint32_t NumImages 
);

项目的接口将使用 C 构建,而函数将使用 C++。在阅读文档时,我阅读了原型,所以我认为它是“函数原型”。在阅读更多时,我发现作者有时使用术语“功能”,有时使用“接口”。我知道如何在 C++ 中创建接口,但在 C 中不知道。

那么上面的代码是关于接口还是函数原型?

不然怎么用C语言创建接口?是通过创建结构(struct)吗?

我希望我的问题不是愚蠢的。我是一名 Java 开发人员,也是一名 C/C++ 简单的学生。

4

3 回答 3

2

这声明了函数,但不提供实现(定义)。所以,你可以说这是一个接口。你只需告诉编译器:“嘿,有一个名为VisionInterf_ImageAttach“的函数,所以当你调用它时它不会抱怨。更多关于声明与定义。

这当然取决于什么VisionAPI_RETURNVisionAPI解决,假设它们是宏。

于 2013-09-10T11:20:43.377 回答
2

C 语言中没有接口这种东西:除了原始类型和指针之外,该语言还支持structs 和函数;这就是你所要做的。

您的代码显示了函数前向声明的示例。C 模块的接口包含多个这样的声明,以及struct这些函数使用的 s 声明。

于 2013-09-10T11:23:26.607 回答
1

(添加到@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 语法的扩展(许多编译器都有某种这样的扩展)。

于 2013-09-10T11:34:53.683 回答