gpt4 book ai didi

c++ - 如何将旧的 C 代码与其中的保留关键字与 C++ 链接?

转载 作者:IT老高 更新时间:2023-10-28 23:21:29 25 4
gpt4 key购买 nike

我有一个 10 多年前的 C 库——我相信——在过去的好日子里它可以正常工作,但是当我尝试将它与 C++ 源代码(包含主函数)一起使用时我遇到了一些困难。

编辑:澄清一下,C 库使用 gcc 编译得很好,它会生成一个目标文件 old_c_library.o。这个库 应该 以某种方式使用,以便 C 头文件 old_c_library.h 在您的 main 中是 #included .c C 源文件。然后你的主 C 源文件应该被编译并通过 gccold_c_library.o 链接在一起。在这里,我想改用 C++ 源文件 main.cpp,并用 g++ 编译/链接它。

在编译C++源文件的过程中出现了以下三个问题:

  1. 其中一个C库的头文件中包含C++保留字new(它是一个整数的名字),导致 fatal error ;和
  2. C 库的一个头文件包含 calloc 调用(缺少显式类型转换),导致 fatal error ;和
  3. C 库的各种文件包含有符号和无符号整数的比较发生的代码,这会导致警告。

编辑:按照评论中的建议,我尝试使用 #extern "C"{ #include "obsolete_c_library.h"} “trick”,但这并没有解决我的任何问题.

我可以通过重命名保留字的所有实例并将它们替换为 - 基本上 - 其他任何内容来解决问题 1。我可以通过类型转换 calloc 调用来解决问题 2。我可能会尝试通过此处建议的想法来整理警告:How to disable GCC warnings for a few lines of code .

但我仍然想知道,有没有办法以一种优雅、高级的方式克服这些困难,而不实际接触原始库?


相关: Where is C not a subset of C++?Do I cast the result of malloc?How do I use extern to share variables between source files? .

最佳答案

一般来说,如果这些头文件不是在预期这种用法的情况下构建的,那么将 C 头文件 #include 到 C++ 源代码中是不安全的。在某些情况下它可以工作,但您需要准备好修改 header 或为要访问的函数和全局变量编写自己的声明。

至少,如果 C 头文件声明了任何函数并且您没有在 C++ 中重新编译这些函数,那么您必须确保在 C++ 代码中为声明分配了 C 链接。 C 头文件通过条件编译指令自动解释这一点并不少见,但如果它们不这样做,那么您可以通过将包含包含在 C 链接 block 中来做到这一点:

extern "C" {
#include "myclib.h"
}

如果 C 头文件声明了名称与 C++ 关键字冲突的全局变量,并且您不需要引用,那么您可能能够使用预处理器重新定义它们:

#define new extern_new
#include "myclib.h"
#undef new

这不能保证有效,但值得一试。不要忘记在包含 C 头文件后对此类宏进行 #undef,如图所示。

可能还有其他有趣的技巧可以使用宏来调整特定的头文件以适应 C++,但在某些时候,在你的主要 C++ 源代码中复制/重写所需的声明(并且只有那些声明)更有意义在您自己的 C++ 头文件中。请注意,这样做并不能消除声明 C 链接的需要——该要求来自已由 C 编译器而不是 C++ 编译器编译的库。

关于c++ - 如何将旧的 C 代码与其中的保留关键字与 C++ 链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36867325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com