我有一个超过10年的C库 - 我相信 - 在过去的美好时光里工作得很好,但是当我试图在C++源代码中使用它时(包含主函数)遇到了一些困难。如何使用C++将旧C代码与保留关键字相关联?
编辑:为了澄清,C库编译得很好,用gcc
,它生成一个目标文件old_c_library.o
。这个库是应该以某种方式使用,以便您的main.c
C源文件中的C头文件old_c_library.h
为#include
d。然后,您的主C源文件应该编译并通过与old_c_library.o
链接在一起。在这里,我想使用C++源文件main.cpp
来代替,并使用g++
进行编译/链接。发生
以下三个问题,C++源文件的编译过程中:
- C库的头文件中的一个包含所述C++保留字
new
(它是一个整数的名称),导致致命错误;和 - C库的其中一个头文件包含
calloc
调用(缺少明确的类型转换),导致致命错误;和 - C库的各种文件包含代码,其中发生了带符号和无符号整数的比较,从而导致警告。
编辑:我试图使用#extern "C" { #include "obsolete_c_library.h" }
“窍门”,正如评论中所建议的那样,但这并没有解决我的任何问题。
我可以通过重命名保留字的所有实例并将其替换为 - 基本上 - 其他任何内容来解决问题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?。
在包含使用'new'作为变量名称的标题后,您可以在之前放置一个'#define new old',并在'#undef new'处输入 – user463035818
如果关键字问题仅出现在旧库的实现中不是它的API),为什么不单独编译并且只将它链接到C++项目中? – nils
唯一的优雅方式可能是更新库。一旦你被要求让代码腐烂,优雅就会消失,你将不得不使用任何肮脏的黑客来完成工作。 – ComicSansMS