【问题标题】:Pointer Casting/Conversion Solution Upgrading C to C++将 C 升级到 C++ 的指针转换/转换解决方案
【发布时间】:2012-02-09 01:05:25
【问题描述】:

我正在修改 C 源文件 (libape-spidermonkey.c)。我包含一个使用某些 C++ 功能(例如,class definitionsSTL string vector)的 lib 头文件,因此我必须使用 g++ 而不是 gcc 来编译 libape-spidermonkey.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*’

有什么简单的方法可以解决这个问题吗?像一些宏观魔术?

谢谢。

彼得

【问题讨论】:

  • 你有什么样的 g++ 选项?您是否启用了 -Werror -Wall?如果是,则尝试为此文件禁用 -Werror。
  • 头文件中有哪些 C++ 特性?贴出一些有错误的代码。

标签: c++ casting type-conversion void-pointers


【解决方案1】:

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

因此,我建议您使用 C 样式转换(而不是 C++ static_casts)来修复 libape-spidermonkey.c 中的错误。这将保证如果您将来需要,您的代码仍将在 C 编译器中编译。

【讨论】:

    【解决方案2】:

    将该文件编译为 C 文件,而不是 C++ 文件。 C 和 C++ 对象可以毫无问题地链接在一起。

    【讨论】:

    • 但是我添加了一个lib头文件,它使用了一些C++特性,所以我必须使用C++编译它。我是不是误会了什么?
    • 只要您没有更改 C 以使用 C++ 功能,您仍然可以编译为 C。或者,您必须添加一堆 static_casts。
    • 你是对的。我终于发现,APE 项目确实为 C++ lib 加载提供了一个接口,而无需更改其源代码(尽管它完全没有记录)。因此,我将我的逻辑从原始项目中分离出来,并使用 C++ 进行编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2021-06-06
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多