在这里帮帮我,因为我半信半疑我不能做我想做的事,半信半疑应该有一个合适的解决方法。
我有一个用 C++ 实现的 DLL,因此将一些类导出到链接到它的其他 C++ 模块。没关系。现在我想从一个 C 模块(另一个 DLL)链接到这个 DLL,所以我将提供一个“扁平化”的 C 接口并在内部处理 C++ 的东西。那也没关系。
问题是我想将它作为单个 .h 和关联的 .lib 提供给 C 或 C++ 客户端。所以我的 DLL 中有类似于以下内容的内容:
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
// export a class for the C++ clients
class DLL_API CExportedClass
{
public:
CExportedClass();
// etc. etc.
};
// export flattened C interface for non-C++ clients
#ifdef __cplusplus
extern "C" {
#endif
DLL_API void DoSomethingInternally(); // i.e. implementation uses CExportedClass
#ifdef __cplusplus
}
#endif
当然,这在导入 C++ 模块时可以正常工作,但在导入 C 模块时无法编译,因为它无法识别class
声明。
所以我认为我什至可以做到这一点是错误的吗?我需要分成两个标题吗?在声明(或其他类型)#ifdef __cplusplus
周围使用是否正确且可接受?class
#ifdef
在这里真正为“干净”的答案而苦苦挣扎。