<small id='rhxT5'></small><noframes id='rhxT5'>

    1. <i id='rhxT5'><tr id='rhxT5'><dt id='rhxT5'><q id='rhxT5'><span id='rhxT5'><b id='rhxT5'><form id='rhxT5'><ins id='rhxT5'></ins><ul id='rhxT5'></ul><sub id='rhxT5'></sub></form><legend id='rhxT5'></legend><bdo id='rhxT5'><pre id='rhxT5'><center id='rhxT5'></center></pre></bdo></b><th id='rhxT5'></th></span></q></dt></tr></i><div id='rhxT5'><tfoot id='rhxT5'></tfoot><dl id='rhxT5'><fieldset id='rhxT5'></fieldset></dl></div>
          <bdo id='rhxT5'></bdo><ul id='rhxT5'></ul>
        <tfoot id='rhxT5'></tfoot>

      1. <legend id='rhxT5'><style id='rhxT5'><dir id='rhxT5'><q id='rhxT5'></q></dir></style></legend>

        从 C 优雅地调用 C++

        Elegantly call C++ from C(从 C 优雅地调用 C++)
          <legend id='bhziq'><style id='bhziq'><dir id='bhziq'><q id='bhziq'></q></dir></style></legend>

          <small id='bhziq'></small><noframes id='bhziq'>

            <i id='bhziq'><tr id='bhziq'><dt id='bhziq'><q id='bhziq'><span id='bhziq'><b id='bhziq'><form id='bhziq'><ins id='bhziq'></ins><ul id='bhziq'></ul><sub id='bhziq'></sub></form><legend id='bhziq'></legend><bdo id='bhziq'><pre id='bhziq'><center id='bhziq'></center></pre></bdo></b><th id='bhziq'></th></span></q></dt></tr></i><div id='bhziq'><tfoot id='bhziq'></tfoot><dl id='bhziq'><fieldset id='bhziq'></fieldset></dl></div>

              <tfoot id='bhziq'></tfoot>

                  <tbody id='bhziq'></tbody>
                • <bdo id='bhziq'></bdo><ul id='bhziq'></ul>

                  本文介绍了从 C 优雅地调用 C++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我们用普通的 C (C99) 开发了一些项目.但是,我们有一个库作为 C++ 的源代码(数学库).我们需要这个库所以我想问一下,集成这个源代码的最优雅的方式是什么?

                  We develop some project in plain C (C99). But, we have one library as source codes (math library) in C++. We need this library so I would like to ask, what is the most elegant way to integrate this source codes?

                  CC++ 的大小之比为 20:1 所以移到 C++ 不是选项.我们应该使用静态库吗?动态链接库?(这一切都在 Windows 上).

                  Ratio between sizes of C and C++ is 20:1 so moving to C++ is not the option. Should we use static library? DLL? (It's all on Windows).

                  推荐答案

                  根据评论中的讨论,我应该指出将事物分离为 C 兼容的 struct 鸭 和派生的 class Duck 可能是不必要的.您可能可以安全地将实现铲入 structuck 并消除 class Duck,从而避免 real(...).但我不太了解 C++(特别是它与 C 语言世界的交互方式),无法就此给出明确的答案.

                  Based on discussion in the comment, I should point out that separating things into a C-compatible struct duck and a derived class Duck is probably unnecessary. You can probably safely shovel the implementation into struct duck and eliminate class Duck, thus obviating real(…). But I don't know C++ well enough (in particular, the way it interacts with the C universe) to offer a definitive answer on this.

                  没有理由不能简单地将所有 C 和 C++ 代码链接到一个二进制文件中.

                  There is no reason you can't simply link all your C and C++ code together into a single binary.

                  与 C++ 代码的接口要求您将 C++ API 包装在 C API 中.您可以通过在编译 C++ 代码时在 extern "C" { ... } 中声明一堆函数来实现这一点,而在编译 C 客户端代码时不使用 extern 声明.例如:

                  Interfacing to the C++ code requires that you wrap the C++ API in a C API. You can do this by declaring a bunch of functions inside extern "C" { ... } when compiling the C++ code, and without the extern declaration when compiling the C client code. E.g.:

                  #ifdef __cplusplus
                  extern "C" {
                  #endif
                  
                  typedef struct duck duck;
                  
                  duck* new_duck(int feet);
                  void delete_duck(duck* d);
                  void duck_quack(duck* d, float volume);
                  
                  #ifdef __cplusplus
                  }
                  #endif
                  

                  你可以在你的 C++ 源代码中定义duck 结构,甚至从它继承真正的Duck 类:

                  You can define the duck struct in your C++ source, and even inherit the real Duck class from it:

                  struct duck { };
                  
                  class Duck : public duck {
                  public:
                      Duck(int feet);
                      ~Duck();
                  
                      void quack(float volume);
                  };
                  
                  inline Duck* real(duck* d) { return static_cast<Duck*>(d); }
                  
                  duck* new_duck(int feet) { return new Duck(feet); }
                  void delete_duck(duck* d) { delete real(d); }
                  void duck_quack(duck* d, float volume) { real(d)->quack(volume); }
                  

                  这篇关于从 C 优雅地调用 C++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  Is Type(::x); valid?(是类型(::x);有效的?)
                  Difference between an inline function and static inline function(内联函数和静态内联函数的区别)
                  Compilation fails randomly: quot;cannot open program databasequot;(编译随机失败:“无法打开程序数据库)
                  Too many initializers error for a simple array in bcc32(bcc32 中的简单数组的初始值设定项过多错误)
                  No Member named stoi in namespace std(命名空间 std 中没有名为 stoi 的成员)
                  Error using a constexpr as a template parameter within the same class(在同一个类中使用 constexpr 作为模板参数时出错)

                    <tfoot id='QjQ1f'></tfoot>

                        <i id='QjQ1f'><tr id='QjQ1f'><dt id='QjQ1f'><q id='QjQ1f'><span id='QjQ1f'><b id='QjQ1f'><form id='QjQ1f'><ins id='QjQ1f'></ins><ul id='QjQ1f'></ul><sub id='QjQ1f'></sub></form><legend id='QjQ1f'></legend><bdo id='QjQ1f'><pre id='QjQ1f'><center id='QjQ1f'></center></pre></bdo></b><th id='QjQ1f'></th></span></q></dt></tr></i><div id='QjQ1f'><tfoot id='QjQ1f'></tfoot><dl id='QjQ1f'><fieldset id='QjQ1f'></fieldset></dl></div>
                        1. <legend id='QjQ1f'><style id='QjQ1f'><dir id='QjQ1f'><q id='QjQ1f'></q></dir></style></legend>
                            <tbody id='QjQ1f'></tbody>
                          • <bdo id='QjQ1f'></bdo><ul id='QjQ1f'></ul>

                            <small id='QjQ1f'></small><noframes id='QjQ1f'>