我正在尝试阅读项目文档。在标题原型下,我有这个代码:
VisionAPI_RETURN VisionAPI VisionInterf_ImageAttach(
VisionAPI_HANDLE ImageHandle ,
uint32_t NumImages
);
当函数使用C ++时,项目的接口将用C语言构建。 在阅读文档时,我阅读了原型,所以我认为它是“函数原型”。在阅读更多内容时,我发现作者有时使用术语“功能”,有时使用“界面”。我知道如何在C ++中创建一个接口,而不是在C中。
以上关于界面或函数原型的代码是什么?
否则,如何使用C语言创建界面?是否通过创建结构(struct)?
我希望我的问题不是愚蠢的。我是一名Java开发人员,也是一名C / C ++简单学生。
答案 0 :(得分:2)
这声明了该函数,但未提供实现(定义)。所以,你可以说这是一个界面。你只需告诉编译器:“嘿,是一个名为VisionInterf_ImageAttach
的函数”,所以当你调用它时它不会抱怨。 More about declaration vs. definition.
这当然取决于VisionAPI_RETURN
和VisionAPI
解决的问题,假设它们是宏。
答案 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语法的扩展(许多编译器都有某种类型的扩展)。