看板 C_and_CPP 關於我們 聯絡資訊
這個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
Killercat:看來Modern C++ Design這本書也有點out of date了... 01/14 15:57
Killercat:不過好消息是 reinterpret_cast會幫你擋下來了 01/14 15:59
Killercat:不太需要在前面土炮的自己檢查sizeof 01/14 16:00
azureblaze:真的modern的作法就直接static_assert了 01/14 16:01
Killercat:也對 modern c++ design很多做法在c++11都太土炮了 XD 01/14 16:02
azureblaze:另外arr[0]不是標準C 所也也不能算他錯 01/14 16:03
azureblaze:這告訴我們寫書不要用"modern""最新"等修飾詞XD 01/14 16:04
Killercat:唉 當年的modern XD 01/14 16:05
firose:十年都過去了.... 01/14 19:12
diabloevagto:十年前的 modern 01/14 19:20
Bencrie:當 modern 變成 classic ... 01/15 16:27
Killercat:可是很不幸的是,一些程式設計的經典思維仍然還是得從 01/15 19:10
Killercat:這些10年以上的書去學習。Design Patterns, Modern C++ 01/15 19:10
Killercat:Design, Effective/More Effective/Exceptional/More Ex 01/15 19:10
Killercat:ceptional(這本好像沒中譯?)都是難以被取代的經典 01/15 19:11
Killercat:我翻了不少近代的書 真的完全沒有一本提到Exception 01/15 19:11
Killercat:neutral的重要性以及實作方法,真的一本都沒有... 01/15 19:12
Killercat:大概近代書最驚豔的就API Design for C++了 01/15 19:13
Killercat:或者還有版友能分享一下近期值得一看的書單嗎 :D 01/15 19:14
yoco315:很久以前就發現gcc不吃這套了,然後去挖了loki的source 01/15 19:57
yoco315:發現loki實際上也不是這樣實作,不過我也忘記他怎麼弄了 01/15 19:57
yoco315:就是說,雖然書上這麼寫,但作者可能很快就發現現實的編譯器 01/15 19:58
yoco315:再這點上並不符合標準,作者用別的方法作到一樣的功能 01/15 19:58
yoco315:但書為求簡明,不會去寫上一堆#ifdef __GCC__ 之類的鬼東西 01/15 19:59
yoco315:但他又的確需要一個compile time assert的設施,所以.. 01/15 20:00
Killercat:我這邊是爬不到loki source code 不過我猜是把 01/16 12:20
Killercat:0改成-1而已 我在我這邊不支援c++11的build chain 01/16 12:20
Killercat:目前是用這種方法來解決這問題 01/16 12:20
Killercat:「0可以過!?那-1總會死了吧 嘖嘖」(設計對白)(?) 01/16 12:21