一个C++写的头文件包含了string库,在一个C写的头文件中include了这个头文件,编译时报错

项目的代码是C和C++语言混合编写的,主要是C部分调用C++编写的模块。在一个C++写的头文件xml_definition.h中有#include,在一个C写的头文件中include了这个C++头文件。
在编译时报错 string: No such file or directory

img


请问应该如何解决这种依赖问题?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    这种情况下,需要在C头文件中使用extern "C"来声明包含的C++头文件,并使用g++编译器来编译整个项目。

    下面是具体的解决方案:

    1. 在C++头文件xml_definition.h中,可以在代码的开头添加以下代码,以指定这个头文件的编译方式:
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    // your code here
    
    #ifdef __cplusplus
    }
    #endif
    

    这段代码实际上是将C++的代码包裹在一个extern "C"块中,这样C编译器就可以正确处理C++的代码。

    1. 在C头文件中,需要使用#include和extern "C"来包含C++头文件,并声明extern "C"块中包含的所有函数、变量等符号使用C语言的命名规则。
    extern "C" {
    #include "xml_definition.h"
    }
    
    // your code here
    

    这样可以让C编译器正确处理C++头文件中的代码,并且可以正确编译整个项目。

    1. 然后,需要使用g++编译器来编译整个项目。可以使用以下命令:
    g++ -o my_program my_program.c my_c_code.c my_cpp_code.cpp -lstdc++
    

    其中:

    • -o 指定输出文件名
    • my_program.c 指定C代码文件
    • my_c_code.c 指定C代码文件
    • my_cpp_code.cpp 指定C++代码文件
    • -lstdc++ 指定链接C++标准库

    这样就可以正确编译整个项目,在链接时也不会有任何问题。

    完整的代码示例请见下方:

    // xml_definition.h
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #include <string>
    
    // your code here
    
    #ifdef __cplusplus
    }
    #endif
    
    // my_c_code.h
    
    extern "C" {
    #include "xml_definition.h"
    }
    
    // your code here
    
    // my_cpp_code.cpp
    
    #include "xml_definition.h"
    
    // your C++ code here
    

    编译命令:

    g++ -o my_program my_program.c my_c_code.c my_cpp_code.cpp -lstdc++
    

    这样就可以解决这种依赖问题了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在 C 代码中 include 了 C++ 代码的头文件,会导致编译器无法识别 C++ 代码中的部分语法,例如 C++ 标准库中的 string 类型,从而产生编译错误。

为了解决这个问题,可以将 C++ 代码的头文件声明部分用 extern "C" 包裹起来,这样可以告诉编译器这部分代码使用了 C 语言的语法规则,从而避免编译错误。例如:

#ifdef __cplusplus
extern "C" {
#endif

// C++ 代码的声明部分

#ifdef __cplusplus
}
#endif

在 xml_definition.h 文件中加入这样的包裹,然后在 C 代码中 include 这个头文件即可。这样编译器就会将 C++ 代码中的部分语法解析为 C 语言的语法,从而避免编译错误。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢