error: cast from 'char*' to 'int' loses precision [-fpermissive] on using reinterpret_cast (C++)
error: cast from 'char*' to 'int' loses precision [-fpermissive] on using reinterpret_cast (C++)
我正在尝试 C++ 中的不同转换运算符。
根据我对 reinterpret_cast 的理解,它将 don't type 转换为根本不同的类型。
但是下面的一段代码抛出了这个错误“从 '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;
}
错误是什么意思?
What does the error mean?
最重要的是,该消息表示程序格式错误。从类型 char *
到类型 int
的转换未在语言中定义(在本例中)。
该消息还包含“失去精度”的额外细节。由此我们可以推断,指针类型可表示的内存地址比整数类型可表示的数字更多(在 C++ 语言的这个特定实现中)。此详细信息是不允许转换的原因。 Reinterpret cast from pointer to integer 仅在整数可以表示指针类型的所有可能值的情况下定义。在存在此类整数类型的语言实现中,标准库中的类型有一个类型别名:std::uintptr_t
char *p = "This is a string"
这个隐式转换也是错误的。字符串文字,即 const char
的数组,在 C++ 中不能隐式转换为 char*
(自 C++11 起;在此之前,此类转换是允许的,但已弃用)。
Can you please provide a snippet of code where reinterpret_cast is used correctly?
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;
}
要将字符串转换为值,类型转换不起作用。
输入字符串需要被解析,标准库可以像这样为你做这件事:
#include <iostream>
#include <string>
int main()
{
std::string str{ "42" };
auto value = std::stoi(str);
std::cout << value;
return 0;
}
我正在尝试 C++ 中的不同转换运算符。 根据我对 reinterpret_cast 的理解,它将 don't type 转换为根本不同的类型。 但是下面的一段代码抛出了这个错误“从 '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;
}
错误是什么意思?
What does the error mean?
最重要的是,该消息表示程序格式错误。从类型 char *
到类型 int
的转换未在语言中定义(在本例中)。
该消息还包含“失去精度”的额外细节。由此我们可以推断,指针类型可表示的内存地址比整数类型可表示的数字更多(在 C++ 语言的这个特定实现中)。此详细信息是不允许转换的原因。 Reinterpret cast from pointer to integer 仅在整数可以表示指针类型的所有可能值的情况下定义。在存在此类整数类型的语言实现中,标准库中的类型有一个类型别名:std::uintptr_t
char *p = "This is a string"
这个隐式转换也是错误的。字符串文字,即 const char
的数组,在 C++ 中不能隐式转换为 char*
(自 C++11 起;在此之前,此类转换是允许的,但已弃用)。
Can you please provide a snippet of code where reinterpret_cast is used correctly?
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;
}
要将字符串转换为值,类型转换不起作用。 输入字符串需要被解析,标准库可以像这样为你做这件事:
#include <iostream>
#include <string>
int main()
{
std::string str{ "42" };
auto value = std::stoi(str);
std::cout << value;
return 0;
}