使用 C++ C 代码中的库

发布于 2024-07-07 23:12:19 字数 1031 浏览 5 评论 0原文

我有一个 C++ 库,它提供了用于管理数据的各种类。 我有该库的源代码。

我想扩展C++ API以支持C函数调用,以便该库可以同时与C代码和C++代码一起使用。

我正在使用 GNU 工具链(gcc、glibc 等),因此语言和体系结构支持不是问题。

有什么原因可以解释为什么这在技术上上是不可能的吗?

有什么我需要注意的陷阱吗?

是否有与此相关的资源、示例代码和/或文档?


我发现的其他一些事情:

  1. 使用以下内容来包装 C 代码需要使用的 C++ 标头。

#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif
  1. 将“真正的”C++ 接口保留在 C 不包含的单独头文件中。在这里考虑PIMPL 原则 。 使用#ifndef __cplusplus #error 有助于检测任何疯狂的情况。
  2. 小心 C++ 标识符作为 C 代码中的名称
  3. C 和 C++ 编译器之间的枚举大小不同。 如果您使用 GNU 工具链,这可能不是问题,但仍然要小心。
  4. 对于结构体,请遵循以下形式,这样 C 就不会混淆。

    typedef struct X { ... } X 
      
  5. 然后使用指针来传递 C++ 对象,只需在 C 中将它们声明为 struct X,其中 X 是 C++ 对象。

所有这一切都归功于一位 C++ 奇才朋友的帮助。

I have a C++ library that provides various classes for managing data. I have the source code for the library.

I want to extend the C++ API to support C function calls so that the library can be used with C code and C++ code at the same time.

I'm using GNU tool chain (gcc, glibc, etc), so language and architecture support are not an issue.

Are there any reasons why this is technically not possible?

Are there any gotcha's that I need to watch out for?

Are there resources, example code and/or documentation available regarding this?


Some other things that I have found out:

  1. Use the following to wrap your C++ headers that need to be used by C code.
#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif
  1. Keep "real" C++ interfaces in separate header files that are not included by C. Think PIMPL principle here. Using #ifndef __cplusplus #error stuff helps here to detect any craziness.
  2. Careful of C++ identifiers as names in C code
  3. Enums varying in size between C and C++ compilers. Probably not an issue if you're using GNU tool chain, but still, be careful.
  4. For structs follow the following form so that C does not get confused.

    typedef struct X { ... } X
    
  5. Then use pointers for passing around C++ objects, they just have to be declared in C as struct X where X is the C++ object.

All of this is courtesy of a friend who's a wizard at C++.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

铃予 2024-07-14 23:12:19

是的,这当然是可能的。 您需要用 C++ 编写一个接口层,用 extern "C" 声明函数:

extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}

然后,您将从 C 模块调用 foo(),这将传递调用用 C++ 实现的 realFoo() 函数。

如果您需要公开带有数据成员和方法的完整 C++ 类,那么您可能需要做比这个简单函数示例更多的工作。

Yes, this is certainly possible. You will need to write an interface layer in C++ that declares functions with extern "C":

extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}

Then, you will call foo() from your C module, which will pass the call on to the realFoo() function which is implemented in C++.

If you need to expose a full C++ class with data members and methods, then you may need to do more work than this simple function example.

抽个烟儿 2024-07-14 23:12:19

C++ FAQ Lite:“如何混合 C 和 C++ 代码”

这些问题的答案中描述了一些陷阱:

  • [32.8] 如何将 C++ 类的对象传递给 C 函数/从 C 函数传递?
  • [32.9] 我的 C 函数可以直接访问 C++ 类的对象中的数据吗?

C++ FAQ Lite: "How to mix C and C++ code".

Some gotchas are described in answers to these questions:

  • [32.8] How can I pass an object of a C++ class to/from a C function?
  • [32.9] Can my C function directly access data in an object of a C++ class?
紅太極 2024-07-14 23:12:19

主要问题:C 中无法捕获异常。如果 C++ 代码中可能出现异常,请非常小心地编写 C 代码或 C++ 包装器。 相反,C 代码中的异常机制(即 longjump)(如各种脚本语言中所见)不需要为堆栈上的 C++ 对象调用析构函数。

Main gotcha: exceptions can not be caught in C. If there is the possibility of an exception rising in the C++ code, either write your C code or your C++ wrappers very carefully. Conversely, exception like mechanisms (i.e., longjump) in the C code (as found in various scripting languages) are not required to invoke destructors for C++ objects on the stack.

隔岸观火 2024-07-14 23:12:19

您可以混合 C/C++ 代码。 如果你的 main() 函数是 C++ 语言,那么你只需要确保你的 c 函数被声明。

extern "C"

如果你的 main 是 C 语言,那么除了静态变量之外,你可能没问题。 任何带有静态变量的构造函数都应该在 main() 启动之前调用。 如果 C 是您的主要语言,则不会发生这种情况。 如果你有很多静态变量,最好的办法就是用单例替换静态变量。

you can mix C/C++ code. If your main() function in in C++, then you just need to make sure your c functions are declared

extern "C"

If your main is C, then you are probably OK except for static variables. Any constructors with your static variables are supposed to be called before main() start. This won't happen if C is your main. I you have a lot of static variables, the best thing to do is to replace static variables with singletons.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文