2012-01-12 86 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編譯器中編譯,如果你以後需要的話。