2012-01-12 87 views
1

我正在修改C源文件(libape-spidermonkey.c)。我包含一个使用某些C++特性的库头文件(例如,class definitions,STL string vector),所以我必须使用g++而不是gcc来编译libape-spidermonkey.c指针铸造/转换解决方案将C升级到C++

然而,因为在C++的类型检查的,我得到了很多错误(不是警告)的:

libape-spidermonkey.c: In function ‘JSBool ape_sm_raw_constructor(JSContext*, JSObject*, uintN, jsval*, jsval*)’: 
libape-spidermonkey.c:2217:1: error: invalid conversion from ‘void*’ to ‘ape_sm_compiled*’ 
libape-spidermonkey.c: In function ‘JSBool ape_sm_sockclient_constructor(JSContext*, JSObject*, uintN, 
libape-spidermonkey.c:2231:1: error: invalid conversion from ‘void*’ to ‘ape_sm_compiled*’ 
libape-spidermonkey.c:2244:38: error: invalid conversion from ‘void*’ to ‘_ape_sock_js_obj*’ 
libape-spidermonkey.c:2248:53: error: invalid conversion from ‘void*’ to ‘_ape_sock_callbacks*’ 
libape-spidermonkey.c:2257:36: error: invalid conversion from ‘void*’ to ‘ape_socket*’ 
libape-spidermonkey.c: In function ‘JSBool ape_sm_pipe_constructor(JSContext*, JSObject*, uintN, jsval* 
libape-spidermonkey.c:2281:1: error: invalid conversion from ‘void*’ to ‘ape_sm_compiled*’ 
libape-spidermonkey.c: In function ‘JSBool ape_sm_sockserver_constructor(JSContext*, JSObject*, uintN, 
libape-spidermonkey.c:2585:1: error: invalid conversion from ‘void*’ to ‘ape_sm_compiled*’ 
libape-spidermonkey.c: In function ‘JSBool ape_sm_xorize(JSContext*, JSObject*, uintN, jsval*, jsval*)’ 
libape-spidermonkey.c:2632:1: error: invalid conversion from ‘void*’ to ‘ape_sm_compiled*’ 
libape-spidermonkey.c:2646:31: warning: comparison between signed and unsigned integer expressions 
libape-spidermonkey.c:2650:36: error: invalid conversion from ‘void*’ to ‘char*’ 

有没有简单的方法来解决这个问题?像一些宏观魔法?

谢谢。

Peter

+0

你有什么样的g ++选项?你有没有启用 - 错误 - 墙?如果是,则尝试禁用此错误文件。 – Zuljin 2012-01-12 18:32:51

+0

头文件中有哪些C++特性?发布一些有错误的代码。 – 2012-01-12 18:36:02

回答

4

将该文件编译为C文件而不是C++文件。 C和C++对象可以无缝连接在一起。

+0

但我添加了一个使用一些C++特性的库头文件,所以我必须使用C++进行编译。我误解了什么吗? – 2012-01-12 18:26:53

+0

只要你没有改变C来使用C++特性,你仍然可以编译为C.或者,你必须添加一堆'static_cast's。 – 2012-01-12 18:33:23

+0

你是对的。我终于发现,APE项目确实提供了一个用于C++ lib加载的接口,而无需更改它们的源代码(尽管它完全没有记录)。因此,我将我的逻辑从原始项目中分离出来,并使用C++进行编译。 – 2012-01-15 00:17:06

1

这是一个很好的做法(即使是C开发人员)尝试使用C++编译器编译C代码。 C++编译器发现的错误将帮助您提高代码质量。

所以我建议你使用C风格的铸造(而不是C++的static_casts)修复libape-spidermonkey.c中的错误。这将保证你的代码仍然可以在C编译器中编译,如果你以后需要的话。