c++ - 错误:在使用 reinterpret_cast (C++) 时,从 'char*' 转换为 'int' 会失去精度 [-fpermissive]
问题描述
我正在尝试 C++ 中的不同类型转换运算符。在我对 reinterpret_cast 的理解中,它将不类型转换为根本不同的类型。但是下面的代码会抛出这个错误“从 'char*' 转换为 'int' 失去精度 [-fpermissive]”。
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
int i;
char *p = "This is a string";
i = reinterpret_cast<int>(p);
cout << i;
return 0;
}
错误是什么意思?
解决方案
错误是什么意思?
最重要的是,该消息意味着程序格式错误。语言中没有定义从类型char *
到类型的转换int
(在这种情况下)。
该消息还包含“失去精度”的额外细节。由此我们可以推断,指针类型可表示的内存地址比整数类型可表示的数字多(在 C++ 语言的这个特定实现中)。这个细节是不允许转换的原因。仅在整数可以表示指针类型的所有可能值的情况下才定义从指针到整数的重新解释转换。在存在这种整数类型的语言实现中,标准库中的类型有一个类型别名:std::uintptr_t
char *p = "This is a string"
这种隐式转换也是格式错误的。一个字符串文字,它是一个数组,在 C++ 中const char
是不可隐式转换的char*
(自 C++11 起;在此之前,这种转换是允许的,但已弃用)。
您能否提供一段正确使用 reinterpret_cast 的代码片段?
reinterpret_cast 的正确使用极为罕见。它的使用有许多规则限制,为了能够编写正确的程序,您必须了解所有相关规则及其微妙之处。
我可以举个例子,但你必须明白,做出任何改变,无论多么微妙,都极有可能产生错误的程序。这是一个例子,正如承诺的那样:
struct standard_layout_struct {
int first_member;
};
int main() {
standard_layout_struct instance { .first_member=42 };
standard_layout_struct* pointer_to_instance = &instance;
int* pointer_to_member = reinterpret_cast<int*>(pointer_to_instance);
std::cout << *pointer_to_member;
}
推荐阅读
- java - 我尝试将 android 项目与产生错误的 firebase 连接
- python - 在 pandas.DataFrame 中将列转换为标题
- epicorerp - BPM ABL 查询输出到 CSV 文件 - 示例
- ruby-on-rails - 为什么 AWS 上传文字文件路径,而不是上传图片?
- python-3.x - 转置列和数据引导
- python - 将 mediapipe iris tflite 转换为 tf/keras 作为预处理器
- jena - 如何用通用规则引擎中的内置 listContains 替换 SPARQL 中的 VALUES
- php - MongoDB 聚合 - 如何在 PHP 中使用?
- javascript - 有什么方法可以检测客户端是否下载了全图?
- python - tkinter:如何在一帧中使用不同帧中的按钮从 ComboBox 中获取值