C++ 如何知道如何转换为特定类型?
How does C++ know how to cast to a certain type?
如果我写
long long int module = (long long int)GetModuleHandle(L"test.dll");
C++ 如何知道如何转换 HMODULE?好像我是对的 HMODULE 应该是一个结构。
我了解这对基本类型(如 int、float 等)的工作原理,但是
程序员生成的应该有翻译之类的吧?
在 C++ 中,您基本上可以通过滥用类型系统强制按您喜欢的方式处理可访问内存中的任何区域。例如,看看这个乱码,我将 const std::string
重新解释为 const
指向函数的指针,从 int
到包含 vector<double>
的 struct Foo
。现在,如果我尝试用 f
做任何事情,它会崩溃,但即使使用 -Wall
,代码也会编译,我得到的唯一警告是 f
没有被使用。
#include <functional>
#include <vector>
struct Foo {
std::vector<double> d{};
};
using func_type = const std::function<Foo(int)>*;
int main() {
func_type f = reinterpret_cast<func_type>("This is a test");
}
因为正如有人指出的那样,HMODULE
只是一个 void*
,您可以将其转换为任何您想要的。您只是获取它的内存位置并将其存储在 long long int
中。我不知道你为什么要这样做,因为它没有用。
嗯,它不能真的,除非代码告诉它如何,例如通过转换运算符或构造函数。
有一些 built-in 原始数字事物的规则,例如 int
到 float
,或 void*
到 int
… 尽管后一个例子可以只能由像您这样的 reinterpret_cast
或 C-style 演员完成。那是因为转换并没有真正使合乎逻辑有意义,除非“你最了解”,这是你向编译器承诺的。
的确,与大多数句柄类型一样,HMODULE
is actually an alias for a pointer type (specifically, void*
), though the things that HMODULE
s point to will generally be of some class type. So you're casting a void*
to a long long int
, which is something the language's rules know how to do (ref 1, ref 2)。
如果我写
long long int module = (long long int)GetModuleHandle(L"test.dll");
C++ 如何知道如何转换 HMODULE?好像我是对的 HMODULE 应该是一个结构。
我了解这对基本类型(如 int、float 等)的工作原理,但是 程序员生成的应该有翻译之类的吧?
在 C++ 中,您基本上可以通过滥用类型系统强制按您喜欢的方式处理可访问内存中的任何区域。例如,看看这个乱码,我将 const std::string
重新解释为 const
指向函数的指针,从 int
到包含 vector<double>
的 struct Foo
。现在,如果我尝试用 f
做任何事情,它会崩溃,但即使使用 -Wall
,代码也会编译,我得到的唯一警告是 f
没有被使用。
#include <functional>
#include <vector>
struct Foo {
std::vector<double> d{};
};
using func_type = const std::function<Foo(int)>*;
int main() {
func_type f = reinterpret_cast<func_type>("This is a test");
}
因为正如有人指出的那样,HMODULE
只是一个 void*
,您可以将其转换为任何您想要的。您只是获取它的内存位置并将其存储在 long long int
中。我不知道你为什么要这样做,因为它没有用。
嗯,它不能真的,除非代码告诉它如何,例如通过转换运算符或构造函数。
有一些 built-in 原始数字事物的规则,例如 int
到 float
,或 void*
到 int
… 尽管后一个例子可以只能由像您这样的 reinterpret_cast
或 C-style 演员完成。那是因为转换并没有真正使合乎逻辑有意义,除非“你最了解”,这是你向编译器承诺的。
的确,与大多数句柄类型一样,HMODULE
is actually an alias for a pointer type (specifically, void*
), though the things that HMODULE
s point to will generally be of some class type. So you're casting a void*
to a long long int
, which is something the language's rules know how to do (ref 1, ref 2)。