[分享] 關於modern c++ design的STATIC_CHECK

看板C_and_CPP作者 (殺人貓™)時間12年前 (2014/01/14 15:49), 編輯推噓1(1029)
留言30則, 6人參與, 最新討論串1/1
這個STATIC_CHECK有一個前提,就是系統不允許產生char something[0]; 在modern c++ design給的範例是這樣 #define STATIC_CHECK(expr) { char unnamed[(expr) ? 1 : 0];} 基本上這個東西有個先決條件,就是編譯器不容許char something[0]; 不過目前來講這個範例似乎被打破了(剛剛有人回報這個壞了我還找原文看一下) 寫了組小code發現這東西(char aa[0])居然被平安無事地編過了 目前是發現在clang會有這種現象 clang --version Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) Target: x86_64-apple-darwin13.0.0 Thread model: posix compiler flag是 clang++ "$1" -o "$compname" -finput-charset=${enc[$2]} $3 g++也會有一樣的問題 還沒時間測試linux上會不會bypass掉這個 這是新的規格嗎?如果是的話,char[0]到底有什麼特別的意義讓它可以合法化? ----- #include <iostream> #define STATIC_CHECK(expr) { char unnamed[(expr) ? 1 : 0];} template<typename TO, typename FROM> TO safe_reinterpret_cast(FROM from) { STATIC_CHECK(sizeof(TO) >= sizeof(FROM)); return reinterpret_cast<TO>(from); } using namespace std; int main(int argc, char *argv[]) { long llp = 1; char cp = 12; char aa[0]; cout << "sizeof char = " << sizeof(char) << endl; cout << "sizeof long = " << sizeof(long); //char get = safe_reinterpret_cast<char>(llp); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.124.251.135

01/14 15:57, , 2F
看來Modern C++ Design這本書也有點out of date了...
01/14 15:57, 2F

01/14 15:59, , 3F
不過好消息是 reinterpret_cast會幫你擋下來了
01/14 15:59, 3F

01/14 16:00, , 4F
不太需要在前面土炮的自己檢查sizeof
01/14 16:00, 4F

01/14 16:01, , 5F
真的modern的作法就直接static_assert了
01/14 16:01, 5F

01/14 16:02, , 6F
也對 modern c++ design很多做法在c++11都太土炮了 XD
01/14 16:02, 6F

01/14 16:03, , 7F
另外arr[0]不是標準C 所也也不能算他錯
01/14 16:03, 7F

01/14 16:04, , 8F
這告訴我們寫書不要用"modern""最新"等修飾詞XD
01/14 16:04, 8F

01/14 16:05, , 9F
唉 當年的modern XD
01/14 16:05, 9F

01/14 19:12, , 10F
十年都過去了....
01/14 19:12, 10F

01/14 19:20, , 11F
十年前的 modern
01/14 19:20, 11F

01/15 16:27, , 12F
當 modern 變成 classic ...
01/15 16:27, 12F

01/15 19:10, , 13F
可是很不幸的是,一些程式設計的經典思維仍然還是得從
01/15 19:10, 13F

01/15 19:10, , 14F
這些10年以上的書去學習。Design Patterns, Modern C++
01/15 19:10, 14F

01/15 19:10, , 15F
Design, Effective/More Effective/Exceptional/More Ex
01/15 19:10, 15F

01/15 19:11, , 16F
ceptional(這本好像沒中譯?)都是難以被取代的經典
01/15 19:11, 16F

01/15 19:11, , 17F
我翻了不少近代的書 真的完全沒有一本提到Exception
01/15 19:11, 17F

01/15 19:12, , 18F
neutral的重要性以及實作方法,真的一本都沒有...
01/15 19:12, 18F

01/15 19:13, , 19F
大概近代書最驚豔的就API Design for C++了
01/15 19:13, 19F

01/15 19:14, , 20F
或者還有版友能分享一下近期值得一看的書單嗎 :D
01/15 19:14, 20F

01/15 19:57, , 21F
很久以前就發現gcc不吃這套了,然後去挖了loki的source
01/15 19:57, 21F

01/15 19:57, , 22F
發現loki實際上也不是這樣實作,不過我也忘記他怎麼弄了
01/15 19:57, 22F

01/15 19:58, , 23F
就是說,雖然書上這麼寫,但作者可能很快就發現現實的編譯器
01/15 19:58, 23F

01/15 19:58, , 24F
再這點上並不符合標準,作者用別的方法作到一樣的功能
01/15 19:58, 24F

01/15 19:59, , 25F
但書為求簡明,不會去寫上一堆#ifdef __GCC__ 之類的鬼東西
01/15 19:59, 25F

01/15 20:00, , 26F
但他又的確需要一個compile time assert的設施,所以..
01/15 20:00, 26F

01/16 12:20, , 27F
我這邊是爬不到loki source code 不過我猜是把
01/16 12:20, 27F

01/16 12:20, , 28F
0改成-1而已 我在我這邊不支援c++11的build chain
01/16 12:20, 28F

01/16 12:20, , 29F
目前是用這種方法來解決這問題
01/16 12:20, 29F

01/16 12:21, , 30F
「0可以過!?那-1總會死了吧 嘖嘖」(設計對白)(?)
01/16 12:21, 30F
文章代碼(AID): #1IrElygp (C_and_CPP)