C 这是一个接口还是一个功能原型?
我正在读一个项目文档。在Prototype的标题下,我有以下代码:C 这是一个接口还是一个功能原型?,c,interface,struct,C,Interface,Struct,我正在读一个项目文档。在Prototype的标题下,我有以下代码: VisionAPI_RETURN VisionAPI VisionInterf_ImageAttach( VisionAPI_HANDLE ImageHandle , uint32_t NumImages ); 项目的接口将在C中构建,当函数将在C++中。 在阅读文档时,我阅读了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接口等效副本的机制,尽管程序员通常会重新编写