不但可以邊 casting 邊宣告,宣告玩之後還能繼續使用!
不過 gcc 跟 g++ 編譯器的行為不太一樣就是了,g++ 並不會直接給你過關。
code 寫久了,網上的技術文章逛久了,就會發現很多小惡魔小細節,是藏在編譯器裡面。
struct x {
int xx;
};
int main()
{
struct x data;
data.xx = 99;
struct x *tmp = &data;
printf("tmp->xx = %d \n", tmp->xx);
printf("(!#$^&)->yy = %d \n", ((struct y {int yy;} *)(tmp))->yy);
struct y xxxx; // Also can be used later!
// Change *.cpp will have different result
// gcc will select the correct back-end compiler based on file extension
// In c++: error: types may not be defined in casts
return 0;
}
星期五, 11月 01, 2013
星期三, 10月 30, 2013
預防笨錯誤? 尤達表示法 (Yoda Condition)
曾幾何時,在公司的程式碼看到一段code,以下為示意:
if (TRUE == isOilPoisonous)
{
printf("It's Da Tung!");
}
產生很多問號,誰吃飽撐著把 TRUE 放在比較式的左邊呢?
是為了強調這段程式碼的意圖嗎?
事實似乎不是這麼一回事!
直到最近,才知道這東西叫做尤達表示法 (Yoda Condition)。
他存在的目的完全不是為了可讀性,相反的,這種風格使可讀性下降了。
那為什麼要付出代價維持這種風格呢?
原因如下。
看看這兩段程式碼,毫無疑問完全相同,只是條件順序對調了一下。
if (isOilPoisonous == TRUE)
{
printf("It's Da Tung!");
}
if (TRUE == isOilPoisonous)
{
printf("It's Da Tung!");
}
但是如果有人手抖把 "==" 敲成 "=" 的時候,你會發現,其中只有一種會compile error。
而另一個,會巧妙的隱藏,成功地編譯,變成很難發現的臭蟲。
日常生活中,手抖,手殘,以及少打一個等號這種事情,是絕對有可能發生的。
為了避免這種情況,只好犧牲一些可讀性,套用 Yoda Condition,來斃掉這種藏得很深的臭蟲。
事實上,現在的 compiler 可以讓你察覺這種手抖的情況。
用 gcc version 4.4.5 測試了一下,如果你有使用 "-Wall" 參數,
來編譯 "if (isOilPoisonous = TRUE && ...) ...",
你會得到這樣的警告訊息:
yoda.c:7: warning: suggest parentheses around assignment used as truth value
但如果進一步改寫成這樣 "if ((isOilPoisonous = TRUE) && ...) ...",就...
註:尤達大師講話愛用倒裝句。
參考:http://en.wikipedia.org/wiki/Yoda_conditions
if (TRUE == isOilPoisonous)
{
printf("It's Da Tung!");
}
產生很多問號,誰吃飽撐著把 TRUE 放在比較式的左邊呢?
是為了強調這段程式碼的意圖嗎?
事實似乎不是這麼一回事!
直到最近,才知道這東西叫做尤達表示法 (Yoda Condition)。
他存在的目的完全不是為了可讀性,相反的,這種風格使可讀性下降了。
那為什麼要付出代價維持這種風格呢?
原因如下。
看看這兩段程式碼,毫無疑問完全相同,只是條件順序對調了一下。
if (isOilPoisonous == TRUE)
{
printf("It's Da Tung!");
}
if (TRUE == isOilPoisonous)
{
printf("It's Da Tung!");
}
但是如果有人手抖把 "==" 敲成 "=" 的時候,你會發現,其中只有一種會compile error。
而另一個,會巧妙的隱藏,成功地編譯,變成很難發現的臭蟲。
日常生活中,手抖,手殘,以及少打一個等號這種事情,是絕對有可能發生的。
為了避免這種情況,只好犧牲一些可讀性,套用 Yoda Condition,來斃掉這種藏得很深的臭蟲。
事實上,現在的 compiler 可以讓你察覺這種手抖的情況。
用 gcc version 4.4.5 測試了一下,如果你有使用 "-Wall" 參數,
來編譯 "if (isOilPoisonous = TRUE && ...) ...",
你會得到這樣的警告訊息:
yoda.c:7: warning: suggest parentheses around assignment used as truth value
但如果進一步改寫成這樣 "if ((isOilPoisonous = TRUE) && ...) ...",就...
註:尤達大師講話愛用倒裝句。
參考:http://en.wikipedia.org/wiki/Yoda_conditions
星期四, 12月 08, 2011
Dropbox + Git = 免費的 Git server
先在 Dropbox 中新增一個 repository
~/Dropbox/git$ mkdir project.git
~/Dropbox/git$ cd project.git
~/Dropbox/git$ git init --bare
~/Dropbox/git$ cd ~/project
git init --bare 的意思是說這個資料夾初始化後不會有 working directory,裡面只有一些 meta data,所以你是沒有辦法在底下看到跟修改 srouce code。通常 server 上的 repo 都是這樣 init。
~/project$ git init
~/project$ git add .
~/project$ git commit -m "first commit"
~/project$ git remote add origin ~/Dropbox/git/project.git
~/project$ git push origin master
接著其他人只要在他們的電腦中執行
git clone ~/Dropbox/git/project.git
便可以開工啦,真的是非常的方便。不過這方法比較適用於小團隊的合作開發,如果人數眾多,可能會碰到 Dropbox 裡面檔案在同步的同時產生 conflict。 不過因為每個人 local 端都有完整的 repository 所以不需要擔心救不回來。
星期三, 12月 07, 2011
在 Windows 下使用 Sublime 撰寫 Markdown
準備的材料有
安裝 Sublime 以及 Pandoc 之後,點選 Sublime 裡的 Preferences > Browse Packages。然後在 Markdown 這個資料夾中,新增名為 "Markdown.sublime-build" 的檔案,檔案內容如下:
接著在 Tool 裡面選擇正確的 Build System 後,按 F7 便可以轉換出 html 啦。
也有另外一個 editor 叫做 MarkdownPad 可以即時顯示轉換結果,介面設計得還不錯,非常的乾淨簡潔,不過稍微用了一下後發現 email 格式 <abc@gmail.com> 轉不出來啊。
語法參考: Markdown syntax
參考: https://gist.github.com/954436
安裝 Sublime 以及 Pandoc 之後,點選 Sublime 裡的 Preferences > Browse Packages。然後在 Markdown 這個資料夾中,新增名為 "Markdown.sublime-build" 的檔案,檔案內容如下:
{ "cmd": ["pandoc.exe", "-f", "markdown", "-t", "html", "-o", "$file.html", "$file"], "selector": "source.md" } 接著在 Tool 裡面選擇正確的 Build System 後,按 F7 便可以轉換出 html 啦。
也有另外一個 editor 叫做 MarkdownPad 可以即時顯示轉換結果,介面設計得還不錯,非常的乾淨簡潔,不過稍微用了一下後發現 email 格式 <abc@gmail.com>
語法參考: Markdown syntax
參考: https://gist.github.com/954436
訂閱:
文章 (Atom)