【问题标题】:Using C++ files in C project在 C 项目中使用 C++ 文件
【发布时间】:2022-01-04 03:20:12
【问题描述】:

出于好奇:有没有办法在 C 项目中使用 C++ 文件?对于文件,我的意思是能够从头文件和库中访问函数,并在您自己的项目中使用它们来解决已经解决的问题。

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    是的,如果您小心的话,可以混合使用 C 和 C++。具体情况取决于您使用的编译器等。

    在 C++ 常见问题解答中有一整章介绍它:http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

    【讨论】:

      【解决方案2】:

      如果你将函数、变量和结构外部化

      extern "C" {
          int global;
      }
      

      在头文件中和

      extern "C" int global = 20; 
      

      在您的 C++ 代码中,它可以在 C 代码中使用。同样的规则也适用于函数。

      您甚至可以使用适当的原型调用方法。例如:

      class C 
      {
      public: 
           c(int);
           int get();
      };
      

      .cpp 中的 C-Wrapper 可能如下所示:

      extern "C" void * createC(int i)
      {
           return (void *) new C(i);
      }
      
      extern "C" int Cget(void *o)
      { 
           return ((C *)o)->get();
      }
      

      【讨论】:

        【解决方案3】:

        是否可以选择相反的方向? C++ 代码可以包含 C 头文件并直接链接到 C 库(并且 C 代码通常可以编译为 C++,只需很少或没有更改),但是从 C 中使用 C++ 需要更加小心。

        您不能在 C 文件中包含 C++ 标头并期望将其编译为 C。

        因此,您需要做的是从您的 C++ 代码中公开一个与 C 兼容的接口(一个标头,其中所有内容都包含在 extern "C" 中,并且不使用 C++ 特定的功能)。如果你有这样的头文件,你可以简单地从你的 C 代码中包含它,并链接到 C++ 库。

        【讨论】:

          【解决方案4】:

          可能最简单的做法是使用 C++ 编译器编译 C 文件。绝大多数代码都将兼容,您将可以免费使用 C++ 标头。

          【讨论】:

          • 为什么投反对票?这可能不是 OP 喜欢的方法,但我在答案中看不到任何不正确或绝对糟糕的建议。
          • 我猜不是,但是我们这些喜欢 C 的人发现“将其编译为 C++”的解决方案很快就提出来了,然后被批评为 C 风格。让语言之间日益减少的兼容性成为现实吧。这两种语言是不同的,不应假装其他。
          • 您的个人语言偏好不应成为否决认为其他语言更好的答案的理由。
          【解决方案5】:

          如果您为 C++ 库提供 C API,则可以使用它。只需在单独的标头中定义 C API(您不能在 C 文件中将标头与 C++ 代码一起使用)。 ICU 项目就是这样做的,它在内部使用 C++,但同时提供 C 和 C++ API。

          【讨论】:

            【解决方案6】:

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多