[問題] union 的undefine behavior
平常真的很少用union 所以當要用的時候還是查了一下
https://en.cppreference.com/w/cpp/language/union
S s = {0x12345678}; // initializes the first member, s.n is now the active
member
// at this point, reading from s.s or s.c is undefined behavior
诶, 這不就是常看到union的標準用法嗎?
於是我再找找
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Ru-pun
恩....真的是undefined behavior.....完全顛覆我之前對union的認知
原來看到這種union { struct{} , array;} 全部都是UB...
想問一下
1. 即使他是 書本上的UB 但是不是可以說 所有已知compiler實作上都讓他效果一致
也就是常用的那套手段也沒什麼問題, 真的這樣寫 也不用太苛責?
2. 如果真的不想寫出UB 的程式碼, 是不是只能用reinterpret_cast
例如
union Endian{
int a;
char b;
};
改用
int a = 1; char b = *(reinterpret_cast<char*>(&a));
對於reinterpret_cast每當用 都很怕是UB,
有沒有什麼通則可以快速確認是否轉型是UB呢?
以上 (今天才知道union 這樣寫是UB, 實在很震驚)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.12.193.155 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1592238947.A.863.html
※ 編輯: lovejomi (39.12.193.155 臺灣), 06/16/2020 01:00:08
→
06/16 02:09,
4年前
, 1F
06/16 02:09, 1F
→
06/16 02:09,
4年前
, 2F
06/16 02:09, 2F
→
06/16 02:09,
4年前
, 3F
06/16 02:09, 3F
→
06/16 02:09,
4年前
, 4F
06/16 02:09, 4F
→
06/16 02:09,
4年前
, 5F
06/16 02:09, 5F
→
06/16 02:12,
4年前
, 6F
06/16 02:12, 6F
→
06/16 02:12,
4年前
, 7F
06/16 02:12, 7F
→
06/16 07:34,
4年前
, 8F
06/16 07:34, 8F
→
06/16 09:49,
4年前
, 9F
06/16 09:49, 9F
→
06/16 09:50,
4年前
, 10F
06/16 09:50, 10F
→
06/16 09:50,
4年前
, 11F
06/16 09:50, 11F
→
06/16 09:51,
4年前
, 12F
06/16 09:51, 12F
→
06/16 09:51,
4年前
, 13F
06/16 09:51, 13F
→
06/16 10:50,
4年前
, 14F
06/16 10:50, 14F
→
06/16 10:50,
4年前
, 15F
06/16 10:50, 15F
→
06/16 10:51,
4年前
, 16F
06/16 10:51, 16F
→
06/16 11:05,
4年前
, 17F
06/16 11:05, 17F
→
06/16 11:18,
4年前
, 18F
06/16 11:18, 18F
→
06/16 11:18,
4年前
, 19F
06/16 11:18, 19F
→
06/16 11:19,
4年前
, 20F
06/16 11:19, 20F
→
06/16 11:20,
4年前
, 21F
06/16 11:20, 21F
→
06/16 11:21,
4年前
, 22F
06/16 11:21, 22F
→
06/16 11:24,
4年前
, 23F
06/16 11:24, 23F
→
06/16 11:25,
4年前
, 24F
06/16 11:25, 24F
→
06/16 11:26,
4年前
, 25F
06/16 11:26, 25F
→
06/16 11:26,
4年前
, 26F
06/16 11:26, 26F
→
06/16 11:26,
4年前
, 27F
06/16 11:26, 27F
→
06/16 11:50,
4年前
, 28F
06/16 11:50, 28F
→
06/16 12:51,
4年前
, 29F
06/16 12:51, 29F
→
06/16 12:52,
4年前
, 30F
06/16 12:52, 30F
→
06/16 12:52,
4年前
, 31F
06/16 12:52, 31F
→
06/16 19:18,
4年前
, 32F
06/16 19:18, 32F
→
06/16 19:18,
4年前
, 33F
06/16 19:18, 33F
→
06/16 20:17,
4年前
, 34F
06/16 20:17, 34F
推
06/21 11:02,
4年前
, 35F
06/21 11:02, 35F
→
06/21 11:07,
4年前
, 36F
06/21 11:07, 36F
→
06/21 11:07,
4年前
, 37F
06/21 11:07, 37F