【问题标题】:Compiling C code with g++: Invalid conversion使用 g++ 编译 C 代码:无效转换
【发布时间】:2013-06-03 09:46:49
【问题描述】:

我正在用 g++ 编译 c 代码并遇到一些问题。 修复指定的初始化程序后,我留下了这个错误:

error: invalid conversion from 'void*' to '__u8*'

这是我的代码:

static inline void put_unaligned_le16(__u16 val, __u16 *cp)
    {
        __u8    *p = (void *)cp;

        *p++ = (__u8) val;
        *p++ = (__u8) (val >> 8);
    }

感谢任何帮助解决此问题! 谢谢!

【问题讨论】:

  • 错误很明显:您正试图用void* 初始化__u8*,这在C 中是合法的(隐式转换),但在C++ 中是不合法的(其类型系统“更安全”)。要么使用 GCC 编译,要么将 cp 显式转换为 __u8*(但要注意严格的别名问题......)
  • 在 c++ 中,void 指针必须显式类型化。

标签: c++ c c99 c11


【解决方案1】:

不要尝试使用 C++ 编译器编译 C 代码。曾经。它们是非常不同的不同语言。


(如果您出于某种奇怪的自虐原因仍然这样做,那么您必须将 void * 转换为 __u8 *,因为在 C++ 中,不会发生从 void * 的隐式转换。太糟糕了。)

【讨论】:

  • 谢谢!但是我想修改这个gadgetfs示例(www.linux-usb.org/gadget/usb.c),因此需要使用c++代码。
  • @tzippy 我不明白你为什么必须这样做。 那是一个 C 文件。使用 C 编译器对其进行编译。
  • 我想使用 std::vector 所以我需要 g++ 编译器。这有什么不好?
  • @tzippy 你不想在 usb.c 内部使用std::vector 是吗?
  • 好的,您能否解释一下为什么这是一个坏主意,而不是问对我没有多大帮助的反问?
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 2015-11-05
  • 2011-09-16
  • 1970-01-01
  • 2021-06-05
  • 2022-01-09
  • 2012-07-08
  • 2019-06-28
相关资源
最近更新 更多