[分享] 關於modern c++ design的STATIC_CHECK
這個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:56, , 1F
01/14 15:56, 1F
→
01/14 15:57, , 2F
01/14 15:57, 2F
→
01/14 15:59, , 3F
01/14 15:59, 3F
→
01/14 16:00, , 4F
01/14 16:00, 4F
→
01/14 16:01, , 5F
01/14 16:01, 5F
→
01/14 16:02, , 6F
01/14 16:02, 6F
→
01/14 16:03, , 7F
01/14 16:03, 7F
→
01/14 16:04, , 8F
01/14 16:04, 8F
→
01/14 16:05, , 9F
01/14 16:05, 9F
→
01/14 19:12, , 10F
01/14 19:12, 10F
→
01/14 19:20, , 11F
01/14 19:20, 11F
→
01/15 16:27, , 12F
01/15 16:27, 12F
→
01/15 19:10, , 13F
01/15 19:10, 13F
→
01/15 19:10, , 14F
01/15 19:10, 14F
→
01/15 19:10, , 15F
01/15 19:10, 15F
→
01/15 19:11, , 16F
01/15 19:11, 16F
→
01/15 19:11, , 17F
01/15 19:11, 17F
→
01/15 19:12, , 18F
01/15 19:12, 18F
→
01/15 19:13, , 19F
01/15 19:13, 19F
→
01/15 19:14, , 20F
01/15 19:14, 20F
推
01/15 19:57, , 21F
01/15 19:57, 21F
→
01/15 19:57, , 22F
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
01/15 19:59, 25F
→
01/15 20:00, , 26F
01/15 20:00, 26F
→
01/16 12:20, , 27F
01/16 12:20, 27F
→
01/16 12:20, , 28F
01/16 12:20, 28F
→
01/16 12:20, , 29F
01/16 12:20, 29F
→
01/16 12:21, , 30F
01/16 12:21, 30F