sha*_*oth 0 c++ winapi casting
通常,特别是在Win32编程中,需要从一个opaque类型转换为另一个opaque类型.例如:
HFONT font = cast_here<HFONT>( ::GetStockObject( SYSTEM_FONT ) );
Run Code Online (Sandbox Code Playgroud)
static_cast和reinterpret_cast都适用于此并且具有完全相同的效果,因为HFONT是指向用于定义HFONT的虚拟结构的指针,而GetStockObject()返回的HGDIOBJ是一个void*指针.
哪一个 - static_cast或reinterpret_cast - 更可取?
Ric*_*den 15
说明演员表具有相同的效果是不正确的.演员表演两件完全不同的事情:
static_cast<T>(x)
说表达式转换x
为类型T
.reinterpret_cast<T*>(&x)
说将内存位置'&x'解释为T*考虑以下:
struct A1 { int a1; };
struct A2 { int a2; };
struct B : public A1, public A2 {};
void foo (A1 * a1, A2 * a2)
{
B * b1_a1 = static_cast<B*> (a1);
B * b2_a1 = reinterpret_cast<B*> (a1);
B * b1_a2 = static_cast<B*> (a2);
B * b2_a2 = reinterpret_cast<B*> (a2);
std::cout << "b1_a1==b1_a2" << (b1_a1==b1_a2) << std::endl;
std::cout << "b2_a1==b2_a2" << (b2_a1==b2_a2) << std::endl;
}
int main ()
{
B b;
foo (&b, &b);
}
Run Code Online (Sandbox Code Playgroud)
该程序产生以下输出:
g++ -o t t.cc ; ./t
b1_a1==b1_a2: 1
b2_a1==b2_a2: 0
Run Code Online (Sandbox Code Playgroud)
这提供了如何static_cast
从a2
到b2
正确调整指针,以便它指向的开头b
,但reinterpret_cast
没有.
Sal*_*gar 12
static_cast
总是比较好,reinterpret_cast
除非绝对必要,否则不要做.
reinterpret_cast
是最不安全的演员阵容.
有关此网站应该使用哪些演员表的更多信息.
归档时间: |
|
查看次数: |
1852 次 |
最近记录: |