C 这是一个接口还是一个功能原型?

C 这是一个接口还是一个功能原型?,c,interface,struct,C,Interface,Struct,我正在读一个项目文档。在Prototype的标题下,我有以下代码: VisionAPI_RETURN VisionAPI VisionInterf_ImageAttach( VisionAPI_HANDLE ImageHandle , uint32_t NumImages ); 项目的接口将在C中构建,当函数将在C++中。 在阅读文档时,我阅读了prototype,所以我认为它是“函数原型”。在阅读更多内容时,我发现作者有时使用“功能”,有时使用“接口”。我知道如何在

我正在读一个项目文档。在Prototype的标题下,我有以下代码:

VisionAPI_RETURN VisionAPI VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle , 
     uint32_t NumImages 
);

项目的接口将在C中构建,当函数将在C++中。 在阅读文档时,我阅读了prototype,所以我认为它是“函数原型”。在阅读更多内容时,我发现作者有时使用“功能”,有时使用“接口”。我知道如何在C++中做接口,但不能在C.</P> 那么上面的代码是关于接口还是函数原型的?

否则,如何用C语言创建接口?是通过创建结构来实现的吗


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

这声明了函数,但没有提供实现(定义)。所以,你可以说这是一个接口。您只需告诉编译器:“嘿,有一个名为
VisionInterf\u ImageAttach
”的函数,因此当您调用它时,它不会抱怨


当然,这取决于
VisionAPI\u返回的内容
VisionAPI
解析的内容,假设它们是宏。

这声明了函数,但没有提供实现(定义)。所以,你可以说这是一个接口。您只需告诉编译器:“嘿,有一个名为
VisionInterf\u ImageAttach
”的函数,因此当您调用它时,它不会抱怨


当然,这取决于
VisionAPI\u返回的内容和
VisionAPI
解析的内容,假设它们是宏。

在C语言中没有接口:除了基本类型和指针之外,该语言还支持
struct
s和函数;这就是你要做的一切


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

C语言中没有接口:除了原语类型和指针之外,该语言还支持
struct
s和函数;这就是你要做的一切

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

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

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

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

作为一个简单的示例,假设您定义了如下函数:

int MyFunc( double x, char * z )
{
   // function body code
}
#define VisionAPI_RETURN struct MyReturn
#define VisionAPI __stdcall
struct MyReturn __stdcall VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle, 
     uint32_t NumImages 
);
那么它的原型就是:

int MyFunc( double x, char * z );
甚至

int MyFunc( double, char * );
因为参数名在函数原型中是可选的

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

因此,客户机代码可以
#包括那些头文件来访问库提供的设施,而不知道其实现(这里是“接口”部分),这通常在链接时解决(如果涉及动态链接,则在运行时解决)

编辑(回答评论)

在函数名之前看到的可能是一些宏技巧。因为我不知道上下文是什么,我只能猜测。两个标识符
VisionAPI\u RETURN
VisionAPI
很可能被定义为宏。根据它们的名称,我猜第一个扩展为实际的返回类型,而第二个可以是空宏(通常用于标记某些类别的声明)或扩展为某些编译器特定的关键字组合,通常用于声明函数的低级调用约定

例如,某个地方可能有以下宏定义:

#define VisionAPI_RETURN int
#define VisionAPI 
因此,在预处理器完成其工作后,编译器将看到:

int VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle, 
     uint32_t NumImages 
);
另一个示例-如果这些宏的定义如下:

int MyFunc( double x, char * z )
{
   // function body code
}
#define VisionAPI_RETURN struct MyReturn
#define VisionAPI __stdcall
struct MyReturn __stdcall VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle, 
     uint32_t NumImages 
);
然后原型将按如下方式展开:

int MyFunc( double x, char * z )
{
   // function body code
}
#define VisionAPI_RETURN struct MyReturn
#define VisionAPI __stdcall
struct MyReturn __stdcall VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle, 
     uint32_t NumImages 
);
在这种情况下,返回类型将是
struct MyReturn
,而
\uu stdcall
关键字将指示返回类型(Microsoft编译器使用
\uu stdcall
关键字)。由此产生的语法是对标准C语法的扩展(许多编译器都有类似的扩展)。

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

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

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

作为一个简单的示例,假设您定义了如下函数:

int MyFunc( double x, char * z )
{
   // function body code
}
#define VisionAPI_RETURN struct MyReturn
#define VisionAPI __stdcall
struct MyReturn __stdcall VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle, 
     uint32_t NumImages 
);
那么它的原型就是:

int MyFunc( double x, char * z );
甚至

int MyFunc( double, char * );
因为参数名在函数原型中是可选的

在C语言中没有创建Java接口等效副本的机制,尽管程序员通常会重新编写