溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么避免使用暴露的聯合體

發(fā)布時間:2021-11-26 15:33:07 來源:億速云 閱讀:114 作者:iii 欄目:大數據

本篇內容介紹了“C++怎么避免使用暴露的聯合體”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

C.181:避免使用"暴露的"聯合體

Reason(原因)

暴露的聯合體指的是不包含用來表示哪個(如果存在的話)成員有效的標志的聯合體,程序員必須對數據流保持跟蹤。暴露狀態(tài)的聯合體是錯誤的源頭之一。

Example, bad(反面示例)

union Value {
   int x;
   double d;
};

Value v;
v.d = 987.654;  // v holds a double

到目前為止還好,但是我們會很容易地錯誤使用這個聯合體:

cout << v.x << '\n';    // BAD, undefined behavior: v holds a double, but we read it as an int

注意類型錯誤是在沒有任何顯式類型轉換的情況下發(fā)生的。但我們測試這段程序的時候,輸出的最后一個值是1863627180,它是987.654的二進制對應的整數值。我們在這里遇到的是一個"不可見"類型錯誤,它恰巧給出一個很容易被判斷為沒有問題的結果。

另外,談到"不可見",下面的代碼不會產生輸出:

v.x = 123;
cout << v.d << '\n';    // BAD: undefined behavior
Alternative(可選項)

將聯合體和一個類型字段封裝為一個類。

The C++17 variant type (found in <variant>) does that for you:

C++17的variant類型(可以在<variant>中找到)可以為你做同樣的事:

variant<int, double> v;
v = 123;        // v holds an int
int x = get<int>(v);
v = 123.456;    // v holds a double
w = get<double>(v);

“C++怎么避免使用暴露的聯合體”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI