【问题标题】:Using C code from C++ using autotools使用自动工具从 C++ 中使用 C 代码
【发布时间】:2009-02-08 21:43:53
【问题描述】:

我正在用 C 编写的一些代码之上编写一个(我的第一个)C++ 类,但我只能通过在 extern 块中声明 C 函数来编译 C++。我的项目使用自动工具;有什么办法可以自动化这个过程,这样我就不必维护两个头文件了?

【问题讨论】:

    标签: c++ c linker


    【解决方案1】:

    在 C 代码头文件的 #ifdef 内使用外部块

    头文件的开始

    #ifdef __cplusplus
    extern "C" {
    #endif
    

    ...在头文件的末尾

    #ifdef __cplusplus
    }
    #endif
    

    这样它就可以同时包含在 C 和 C++ 源代码中

    【讨论】:

      【解决方案2】:

      是的,创建包含你的 C 头文件的包装头文件...

      //Wrapper.h
      #ifdef __cplusplus
      extern "C"
      {
      
          #include "Actual.h"
      }
      #else
          #include "Actual.h"
      #endif
      
      
      //Use.cpp
      #include "Wrapper.h"
      
      int main()
      {
          return 0;
      }
      
      //Use.c
      #include "Wrapper.h"
      /*or #include "Actual.h" */
      
      int main()
      {
          return 0;
      }
      

      【讨论】:

      • 虽然这确实有效,但我认为下面的评分更高的答案更好——在实际的头文件中使用预处理器来声明函数extern "C"。这样,您可以在 C 和 C++ 中以相同的方式包含标头,而不必担心额外的“包装器”标头。
      • 是的,但是如果不能修改实际的标题怎么办?如果它是从第三方/其他项目获得的,而这些项目的源代码不是由您维护的,该怎么办?
      【解决方案3】:

      使用 C 预处理器。做这样的事情:

       #ifdef __cplusplus
       extern "C" {
       #endif 
      // code goes here
      
      #ifdef __cplusplus
      }
      #endif
      

      【讨论】:

        【解决方案4】:

        我们在头文件中有一个宏:

        #ifdef __cplusplus
            #define _crtn "C"
        #else
            #define _crtn
        #endif
        

        然后在头文件中,我们可以使用_crtn:

        #include "croutine.h"
        
        extern _crtn void MyFunction( ... );
        

        唯一的问题是确保在包含 MyFunction 实现的文件中包含包含 MyFunction 原型的头文件,以便使用“C”链接编译它。

        这与@epatel 的答案相同,但只需要一个头文件中的丑陋#ifdef

        【讨论】:

        • 鲜为人知的事实:您可以将函数声明为 extern "C++",尽管这有点毫无意义,因为它是使用 C++ 编译时的默认设置,而 C 编译器无法编译 C++。但它可能在未来对假设的 C++++ 语言有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多