robot
最新文章(10)
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
程式碼要清的多乾淨?
FreeBSD 的 Thread-Local Storage 實作
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (93)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 URL
觀「藝術與核心」
by thinker
2 Columns
關鍵字:
C
coding
C++
今天 linkname:jserv http://blog.linux.org.tw/~jserv/ 寫了一篇文章,名為 linkname:[「藝術與核心」] http://blog.linux.org.tw/~jserv/archives/001888.html 的好文。但文章中主要以 GCC 的 extension 為主,以避免將 pointer type 傳給 ARRAY_SZ() 的錯誤。然而,使用 GCC extension 是應該盡量被避免的,除非萬不得以。 在看完該文之後,我仔細思考這個問題,試圖避開 extension ,以標準的語法完成相同的功能。下面是我的嘗試 {{{#!cpp void $test$() { typeof(char[10]) darray; char *dptr; int sz; #define _ARRAY_SZ(D) (sizeof(D) / sizeof(*D)) #define ARRAY_SZ(D) ({ \ typedef typeof(*D) m[_ARRAY_SZ(D)]; \ &D == (m *)0; \ sizeof(D) / sizeof(*D); }) #warning $test$ for array type sz = ARRAY_SZ(darray); #warning $test$ for pointer type sz = ARRAY_SZ(dptr); } }}} 使用 gcc compile 時,在第 14 行會發生錯誤 {{{ thinker:tmp$$ gcc -c $test$.c $test$.c:11:4: warning: #warning $test$ for array type $test$.c:13:4: warning: #warning $test$ for pointer type $test$.c: In function `$test$': $test$.c:14: warning: comparison of distinct pointer types lacks a cast thinker:tmp$$ }}} 透過 pointer 的 type 不相容,一樣可以達到檢查的目的。我個人的立場是,盡量少用 extension 。原因是什麼我也不多說,帶來的好處又是無窮。 == 題外 == 測試當中,不知是否為 gcc 本身的問題,如果我以 {{{ &D == (typeof(*D) (*)[_ARRAY_SZ(D)])0 }}} 替代 typedef 的型式,總是會出錯, GCC 總是誤認為 function call 。 若換成 {{{ &D == (char (*)[_ARRAY_SZ(D)])0 }}} 則可正常運作。顯見宣告的方式應該沒錯,但一透過 typeof() 就不正常。 真不知是我的問題,還是 GCC 的問題,還請善心人士解答。 == 後記 == 事後發現,原來 typeof() 也是 extension 的一部分。記得從我剛開始學習 $C$ 的時侯,就有用過 typeof() ,因此一直以為 typeof() 是標準的用法。發現 typeof() 是 extension 的一部分,也同樣讓我吃了一驚。
最後更新時間: 2007-03-24 19:44:22 CST |
引用
查詢:
COMMENTS: