这是一个接口还是一个函数原型?

时间:2013-09-10 11:18:27

标签: c interface struct

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

VisionAPI_RETURN VisionAPI VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle , 
     uint32_t NumImages 
);

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

以上关于界面或函数原型的代码是什么?

否则,如何使用C语言创建界面?是否通过创建结构(struct)?

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

3 个答案:

答案 0 :(得分:2)

这声明了该函数,但未提供实现(定义)。所以,你可以说这是一个界面。你只需告诉编译器:“嘿,一个名为VisionInterf_ImageAttach的函数”,所以当你调用它时它不会抱怨。 More about declaration vs. definition.

这当然取决于VisionAPI_RETURNVisionAPI解决的问题,假设它们是宏。

答案 1 :(得分:2)

在C语言中没有接口这样的东西:除了原始类型和指针之外,语言还支持struct和函数;这就是你必须要做的所有事情。

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

答案 2 :(得分:1)

(添加@bitmask和@dasblinkenlight提供的已有用信息)

在C中,函数原型大致是函数签名的声明,即函数声明 name 返回类型参数列表类型(即函数接受的参数类型,按各自的顺序排列)。

因此,从某种意义上说,函数的原型可以被视为客户端代码函数的接口(在这种情况下,术语 interface 用于一般的方式,与OOP和Java中的含义不同。)

作为一个更简单的例子,假设您定义这样的函数:

int MyFunc( double x, char * z )
{
   // function body code
}
然后它的原型将是:

int MyFunc( double x, char * z );

甚至

int MyFunc( double, char * );

因为参数名在函数原型中是可选的。

C中没有用于创建Java接口的等效副本的机制,尽管程序员经常将特制的C头文件称为“接口”。这些头文件填充了函数原型和其他声明,这些声明表示它们属于客户端代码的库的“接口”。

因此客户端代码可以#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" calling convention(Microsoft编译器使用__stdcall关键字)。这种结果语法是标准C语法的扩展(许多编译器都有某种类型的扩展)。