Boost.DateTime 来自 C?
Boost.DateTime from C?
是否可以使用 C 中的 Boost.DateTime 库,如果可以,是否有可用的示例(最好涵盖使用 gcc 类工具的构建过程)?我总体上搜索了 Boost 文档和互联网,理论上这似乎是可能的,但还没有找到任何明确的答案。
没有。 Boost 是一个 C++ 库,Boost.DateTime 也不例外。如果您查看 DateTime headers 中的任何一个,您会发现 C++ 功能无处不在,从 类 到模板再到名称空间等等 - none C 支持其中的功能。
但是,您可以在 C++ 中创建一个包装器库,它将您需要的功能公开为纯 C 函数,然后从 C 中调用它们。
C 和 C++ 具有高度的互操作性;从 C++ 调用 C 代码很简单;然而,从 C 调用 C++ 代码受到更多限制,因为接口必须具有 C 链接并且仅包含 C 中可用的类型,并且不能使用 C++ 特定功能,例如默认参数或函数重载。
要在 C 中使用 C++ 代码,需要接口具有 extern "C"
链接规范,这本身不是有效的 C,因此任何头文件中的规范必须是有条件的,例如:
// interop.h
#if !defined INTEROP_H
#define INTEROP_H
#if defined __cplusplus
extern "C"
{
#endif
// C interface here
void somefunction() ;
#if defined __cplusplus
}
#endif
#endif // INTEROP_H
那么接口本身的实现就是C++代码:
// interop.cpp
#include "interop.h"
void somefunction()
{
// C++ code here callable from C through somefunction()
}
但该接口可从 C 代码调用:
// notcpp.c
#include "interop.h"
int main()
{
somefunction() ;
}
这种方法在接口简单的情况下很好,例如,如果您将 Boost Date/Time 库用于某些非常具体的过程,其结果可以用 C 表示,那么这可能是合适的,如果仅在 C 中实现等效功能将令人望而却步。但是为整个 C++ 类 创建 C 包装器非常耗时,容易出错,不灵活并且最终毫无意义 - 将 C 代码编译为 C++ 通常会更简单,然后互操作性障碍消失,因为您可以直接引入 C++ 特定代码到您现有的代码库中(尽管此后它永远不能编译为 C)。 C++ 是多范式,在其自己的 C++ 库中包含 C 库,大多数第三方和 OS C 库头文件已经包含 C++ 条件 C 链接包装器,因此您无需在 OOP 中重写所有代码如果您只想利用更大的库生态系统,则可以使用 C++ 样式。
是否可以使用 C 中的 Boost.DateTime 库,如果可以,是否有可用的示例(最好涵盖使用 gcc 类工具的构建过程)?我总体上搜索了 Boost 文档和互联网,理论上这似乎是可能的,但还没有找到任何明确的答案。
没有。 Boost 是一个 C++ 库,Boost.DateTime 也不例外。如果您查看 DateTime headers 中的任何一个,您会发现 C++ 功能无处不在,从 类 到模板再到名称空间等等 - none C 支持其中的功能。
但是,您可以在 C++ 中创建一个包装器库,它将您需要的功能公开为纯 C 函数,然后从 C 中调用它们。
C 和 C++ 具有高度的互操作性;从 C++ 调用 C 代码很简单;然而,从 C 调用 C++ 代码受到更多限制,因为接口必须具有 C 链接并且仅包含 C 中可用的类型,并且不能使用 C++ 特定功能,例如默认参数或函数重载。
要在 C 中使用 C++ 代码,需要接口具有 extern "C"
链接规范,这本身不是有效的 C,因此任何头文件中的规范必须是有条件的,例如:
// interop.h
#if !defined INTEROP_H
#define INTEROP_H
#if defined __cplusplus
extern "C"
{
#endif
// C interface here
void somefunction() ;
#if defined __cplusplus
}
#endif
#endif // INTEROP_H
那么接口本身的实现就是C++代码:
// interop.cpp
#include "interop.h"
void somefunction()
{
// C++ code here callable from C through somefunction()
}
但该接口可从 C 代码调用:
// notcpp.c
#include "interop.h"
int main()
{
somefunction() ;
}
这种方法在接口简单的情况下很好,例如,如果您将 Boost Date/Time 库用于某些非常具体的过程,其结果可以用 C 表示,那么这可能是合适的,如果仅在 C 中实现等效功能将令人望而却步。但是为整个 C++ 类 创建 C 包装器非常耗时,容易出错,不灵活并且最终毫无意义 - 将 C 代码编译为 C++ 通常会更简单,然后互操作性障碍消失,因为您可以直接引入 C++ 特定代码到您现有的代码库中(尽管此后它永远不能编译为 C)。 C++ 是多范式,在其自己的 C++ 库中包含 C 库,大多数第三方和 OS C 库头文件已经包含 C++ 条件 C 链接包装器,因此您无需在 OOP 中重写所有代码如果您只想利用更大的库生态系统,则可以使用 C++ 样式。