我导入了这个程序,它正在解析大量复杂的文本,并且是用 C 编写的。我自己的项目是用 C++ 编写的。
我实际上的意图是,每当解析器算法找到一个关键标签时,就应该调用我的类的一个(许多)构造函数,这样我就会在 txt 的末尾有一个很好的结构,如下所示解析过程的结果。
问题是这样的:我通过 Java 学习了 OOP,并通过这个项目开始了 C++,所以我需要一些帮助:如何从基于 C 的解析器文件中调用 C++ 构造函数?我已经查过互联网,但要么这个问题太微不足道,要么我想要的解决方案不起作用;)
感谢您的任何建议。
您不能直接调用构造函数,但您可以创建分配和返回对象实例的工厂函数,并且您可以编写这些函数,以便在 C++ 中提供定义(其中可以使用“new”来分配对象并使用 C++ 构造函数),但可从 C 调用。
在标题中,您应该写:
#ifdef __cplusplus
# define EXTERNC extern "C"
# define NOTHROW noexcept
#else
# define EXTERNC
# define NOTHROW
#endif
/* Alias for your object in C that hides the implementation */
typedef void* mylibraryname_mytype_t;
/* Creates the object using the first constructor */
EXTERNC mylibraryname_mytype_t mylibraryname_create_mytype() NOTHROW;
/* Creates the object using the second constructor */
EXTERNC mylibraryname_mytype_t mylibraryname_create_mytype_with_int(int val) NOTHROW;
/* Frees the object, using delete */
EXTERNC void mylibraryname_free_mytype(mylibraryname_mytype_t obj) NOTHROW;
然后在您的 C++ 源文件中,您可以执行以下操作:
EXTERNC mylibraryname_mytype_t mylibraryname_create_mytype() NOTHROW {
try {
return static_cast<mylibraryname_mtype_t>(new MyType);
}
catch (...) {
return nullptr;
}
}
EXTERNC mylibraryname_mytype_t create_mytype_with_int(int val) NOTHROW {
try {
return static_cast<mylibraryname_mytype_t>(new MyType(val));
}
catch (...) {
return nullptr;
}
}
EXTERNC void mylibraryname_free_mytype(mylibraryname_mytype_t obj) NOTHROW {
try {
MyType* typed_obj = static_cast<MyType*>(obj);
delete typed_obj;
}
catch (...) {
// Ignore
}
}
然后,您的 C 代码应该能够包含相同的标头,并在链接到生成的库时使用 C++ 源文件中的定义。
请注意,上面的代码批量吞下了异常。对于真正的 API,您应该提供一种向调用者指示错误的方法(例如,通过输出参数返回分配的对象并返回状态代码),而不是仅仅抑制错误。
Edit
正如评论中所指出的,“_t”在技术上是一个保留后缀(尽管如果您的符号具有将来不太可能被标准库使用的前缀,那么您应该没问题),因此只需确保您的符号包含该库名称作为前缀。还应该注意的是,typedef 虽然不是必需的,但其目的是使对象的使用比整个地方的原始“void *”更具自记录性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)