问题标签 [reinterpret-cast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5993 浏览

c++ - 如何在 C++ 中将无符号长 (DWORD) 重新解释为有符号长?

我想将 a unsigned long(实际上是 a DWORD)重新解释为 a signed long。我试过:

但是,VC++2010 intellisense 告诉我“类型转换无效”。为什么?我如何解决它?

0 投票
2 回答
686 浏览

c++ - 使用 c++0x 标志编译 wxWidgets

尝试wxWidgets-2.9.1从带有c++0x标志的源代码编译时使用gcc-4.6. 我遇到了一个错误

narrowing conversion of '128' from 'int' to 'char' inside { } [-fpermissive] 在文件中src/gtk/dcclient.cpp。错误来自以下文件:

  1. src/gtk/bdiag.xbm
  2. src/gtk/cdiag.xbm
  3. src/gtk/fdiag.xbm
  4. src/gtk/horiz.xbm
  5. src/gtk/verti.xbm
  6. src/gtk/cross.xbm

这是一个已知的错误。 http://trac.wxwidgets.org/ticket/12575 所以我按要求做了,程序编译好了。

diff基本上,该文件有两种修复

//在文件dcclient.h中

  1. 阴影[i] = gdk_bitmap_create_from_data(NULL,bdiag_bits,bdiag_width,bdiag_height);阴影[i] = gdk_bitmap_create_from_data(NULL, reinterpret_cast< const char* >(bdiag_bits) , bdiag_width, bdiag_height);

    //在文件bdiag.xbm和所有 *.xbm 文件中的类似修复

  2. 静态字符bdiag_bits[] = {

    静态无符号字符bdiag_bits[] = { 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x80, 0x80, 0x04 0x20、0x10、0x10、0x08、0x08、0x04、0x04、0x02、0x02、0x01、0x01};

我理解第二个fix,但我无法理解第一个。为什么我们需要做一个reinterpret_cast< const char* >函数gdk_bitmap_create_from_data声明如下:

GdkBitmap* gdk_bitmap_create_from_data (GdkDrawable *drawable, const gchar *data, gint width, gint height);

在同一个文件dcclient.cpp中的几行之后,对 dcclient.cpp的以下调用gdk_bitmap_create_from_data没有给出任何错误。

现在这里不需要类型转换。为什么我们需要做一个 reinterpret_cast on static unsigned char*

0 投票
1 回答
757 浏览

c++ - 如何为具有内部放置 new 的类实现安全复制构造函数(使用 std::string)

这是我的代码:

任何有关如何添加正确处理内部分配 std::string 情况的复制构造函数的建议,将不胜感激。

0 投票
2 回答
172 浏览

c++ - 调用从不兼容类型转换的零数据结构的成员函数 - 未定义?

在不可修改的标头中声明了一个前向 C 结构。我想“虚拟地”向它添加便利的成员函数。显然,我的第一选择是扩展结构并将方法添加到派生类。不能做,因为结构本身在标题中被声明为“转发”,所以我收到错误“错误:不完整类型的无效使用......”。如果我尝试使用旧结构的单个元素定义新结构,我会收到类似的错误。这很糟糕。

然而,我在想我可以用 reinterpret_cast 做一些hacky来让它工作。它会走的路是这样的:

如果我添加了从 B 类型到 A 类型的隐式转换,我认为这几乎可以像 B 是 A 的零数据继承者一样工作。但是,这显然提出了一个问题:这在 C++ 中是未定义的吗?通常我会认为访问非法转换结构的元素是未定义的;那讲得通。但是,我认为从一种类型到另一种类型的 reinterpret_casting,传递该指针,然后再次转换,中间不做任何非法的事情就可以了。我还认为编译器实现非虚拟结构成员的方式是创建一个函数

并使用 B 的适当参数调用它。然后这会简化为前一种情况,根据我的可疑逻辑,这是可以的。所以我认为在一个实际上是 reinterpret_cast A 的结构上调用 .do_something 是可以的。

然而,这并没有说明 C++ 标准在这个问题上的实际说法。有什么帮助吗?此外,如果有人知道这将如何实际工作,(即“每个编译器都接受这个”,或“这只适用于少数编译器”)也会有所帮助,但稍微少一些。

0 投票
5 回答
3360 浏览

c++ - 将无符号解释为有符号

我正在使用嵌入式平台(ARM),在处理位模式时必须小心。让我们假设这条线超出了我的影响:

解释为未签名这将是 206。但实际上它已签名,因此类似于-50。我怎样才能继续使用这个值作为签名?

也没有(导致所有输入值都为 0x10 或 0x00)

我只是希望这些位保持不变,即。(bar == 0xCE)

反之亦然,我很感兴趣如何在不弄乱位模式的情况下将表示负数的位模式转换为无符号变量。我正在使用 GCC。

0 投票
3 回答
7703 浏览

c++ - 如何在 C++ 中使用 reinterpret_cast 强制转换为派生类指针

这是我的测试示例:

它在我打印 s 的行崩溃。由于“b”是指向派生类的指针,所以 reinterpret_cast 应该可以正常工作。我想知道为什么它会崩溃。同时,如果我用 dynamic_cast 替换 reinterpret_cast,那么它就可以工作。

0 投票
1 回答
684 浏览

c++ - 标准布局类型和 reinterpret_cast

如果我已将结构的成员复制到我的班级,我是否可以从班级转换为结构?

0 投票
3 回答
364 浏览

c++ - C++ reinterpret_cast,制作唯一编号

最近,我正在使用代码int为我的班级制作唯一编号。

我使用reinterpret_cast<int>(my_unique_name)wheremy_unique_name是一个char []具有唯一值的变量。如下所示:

我的问题是,生成的所有条目字符串int真的唯一吗?

0 投票
1 回答
1356 浏览

c++ - 将类对象指针打包成 char * 用于消息队列

是否可以通过 POSIX 消息队列正确安全地传递类对象指针?

例如,

并在接收方,执行reinterpret_cast回我的Object

由于消息队列在 Linux 上使用文件描述符,我很好奇它是如何工作的。我尝试过没有成功,但我认为我可能做错了什么。

0 投票
3 回答
605 浏览

c++ - 对成员函数参数使用 reinterpret_cast

这是一些代码:

如果假设上面的定义不能改变,通过什么机制可以调用myType的“someFunction”方法,参数类型为“const containerC&”?

我所能找到的只是从 myType 公开派生一个新类型并使用 reinterpret_cast 重新定义“someFunction”,如下所示:

这安全吗?我的猜测是,这将取决于 containerB 和 containerC 的运营商如何在 someFunction 中使用它们。

所有容器都是模板化的,但这没有区别,这是一个继承层次结构问题。

非常重要:由于为 containerB 和 containerC 定义了显式类型转换,将 containerA 作为参数,我可以将 containerC 作为直接参数传递给 myType::someFunction,但在这种情况下,会发生复制构造,即正是我想要避免的。

一些具体说明:

  • containerB 和 containerC 的属性完全相同
  • someFunction 仅使用 operator[] 来访问容器元素,并且
  • operator+= (但这是在模板元素级别定义的)

containerB 和 containerC 不是两种通用的不同类型:containerC 只是添加了一些成员函数,对象的内部数据没有改变。