gpt4 book ai didi

c++ - 在 C++ DLL 中使用 C 风格导出 API 之间公共(public)类的方法

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:10 27 4
gpt4 key购买 nike

我正在编写 C++ 库,现在正在为其设计 C 风格的 API。现在我有一堆使用主类单例的方法,这里简化声明:

extern "C" {
MYDLL_API void getAudioDeviceList();
MYDLL_API void getWindowList();

MYDLL_API uint32_t BeginVideoCapture();
MYDLL_API uint32_t StopVideoCapture();
}

但到目前为止,我决定删除单例,这让我陷入了困境。通过 API 调用使用我的类的最优雅方式是什么?现在我只看到一种方法,使用全局变量和 init 方法,比如(其中 CVideoConverter 是 C++ 类下的 C 结构包装):

extern "C" {
CVideoConverter* t = new CVideoConverter();

MYDLL_API void getAudioDeviceList();
MYDLL_API void getWindowList();

MYDLL_API uint32_t BeginVideoCapture();
MYDLL_API uint32_t StopVideoCapture();
}

或者我应该创建一些 C 结构,它将包含所有 API 方法和指向 CVideoConverter 对象的指针,导出结构本身。等待您的建议,谢谢!

最佳答案

在头文件中定义全局变量永远不会带来幸福。相反,如果您想要 C++ 代码的 C API,我建议您实际查看 FILE 和标准 C 文件处理函数。

FILE 类型别名是一个不透明结构,您不知道它的内容,也不应该关心。相反,您有一个函数可以分配不透明结构的实例并返回指向它的指针。然后,您所有的 C API 函数都将此指针作为参数。

这个不透明的结构到底是什么?这并不重要,它可以只是一个包含主类实例的私有(private)结构。然后具有结构和类的完整定义的 C API 函数可以使用它来调用所需的成员函数。


一个小而简单的例子:

public 头文件,这是 C 应用程序应包含的内容:

#ifndef MY_C_API_H
#define MY_C_API_H

#ifdef __cplusplus
extern "C" {
#endif

// Forward declaration of the MYSTRUCT structure, and definition of type-alias
typedef struct MYSTRUCT MYSTRUCT;

MYSTRUCT *my_create(void);
void my_destroy(MYSTRUCT *mystruct);
void my_do_something(MYSTRUCT *mystruct, int some_argument);

#ifdef __cplusplus
}
#endif

#endif // End of header include guard

私有(private) 头文件,仅供您的应用程序在内部使用:

#ifndef MY_PRIVATE_H
#define MY_PRIVATE_H

#include "my_c_api.h"
#include "my_class.h"

struct MYSTRUCT
{
MyClass my_object;
};

#endif

C API的实现:

#include "my_private.h"

extern "C"
{
MYSTRUCT *my_create(void)
{
return new MYSTRUCT;
}

void my_destroy(MYSTRUCT *mystruct)
{
delete mystruct;
}

void my_do_something(MYSTRUCT *mystruct, int some_argument)
{
mystruct->my_object.do_something(some_argument);
}
}

关于c++ - 在 C++ DLL 中使用 C 风格导出 API 之间公共(public)类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com