簡體   English   中英

如何在 int * 和 enum * 之間進行轉換?

[英]How to convert between int * and enum *?

從一些 C 遺留代碼中,我得到了一些作為int *的常量。 在 C++ 部分,我有一個底層類型 int 的枚舉。 基於單個值的枚舉和 int 之間的轉換有效。 但是, int *enum *之間的轉換是不可能的。 請參閱下面的代碼示例。

為什么會這樣,我如何將指向某些 int 值的指針轉換為指向 int 枚舉的指針,反之亦然? 我有點期望它能夠工作,因為單值轉換有效並且底層類型相同。 我讀到如果你 static_cast 無效值到枚舉類會發生什么? 但無法確定潛在的無效值是否在這里起作用。

int i = 3;
enum E : int;
E e;

e = static_cast<E>(i);   // ok
i = static_cast<int>(e); // ok

int *j;
E * f;

j = static_cast<int *>(&i); // ok
f = static_cast<E *>(&i);   // 'static_cast': cannot convert from 'int *' to 'E *'
j = static_cast<int *>(&e); // 'static_cast': cannot convert from 'E *' to 'int *'

// now use j and f
*j = *f;

為什么?

從編譯器的角度來看int*E*是不同的非相關類型的指針,這就是為什么static_cast在這里不適用。

我如何將指向某些 int 值的指針轉換為指向 int 枚舉的指針,反之亦然?

您可以嘗試reinterpret_cast而不是static_cast

f = reinterpret_cast<E *>(&i);
j = reinterpret_cast<int *>(&e);

reinterpret_cast

任何指向類型 T1 的對象的指針都可以轉換為指向另一個類型 cv T2 的對象的指針

但是,請注意,取消引用fj (即使用*f*j )將違反嚴格的別名規則(有關更多詳細信息,請參閱下面的討論)。 這意味着這種轉換雖然嚴格可行,但通常沒有用。

枚舉的默認“基本類型”是int並且可以在 OP 中明確指定。 從邏輯上講,存儲在E* e中的值,其中 E 是基本類型為int的枚舉,是一個int 它不能靜態轉換。

在 C++ 中不能保證基本類型的enum (比如)與short布局兼容,但即使語言在這一點上收緊,也可能存在類型兼容性問題/

一個問題是E*int*pi會違反類型安全,因為pi可用於在枚舉之外安靜地設置值。 類似地,如果整數值不在枚舉中,則int*E*可能會違反類型安全。

但是請注意,標准明確指出,沒有什么可以排除枚舉在其定義的值集之外取值:

這組值用於定義枚舉類型的提升和轉換語義。 它不排除枚舉類型的表達式具有超出此范圍的值。

請參見此處: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf (參見第 156 頁的注釋 95 底部)

唯一可能(如果布局兼容性得到保證)有效的情況是E*const int*因為E*所有值都是int並且不能(正確)通過int *指針修改該值而不進一步違反類型系統。

但我認為語言定義並沒有那么微妙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM