看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《loveme00835 (朴髮箍)》之銘言: : 或是如粉紅色字體所寫, 中括號裡的敘述值只能擺正整數: : int array[ 0 ]; : 以上這行, 用 gcc 編譯加上選項 -pedantic 就會顯示警告: : [Warning] ISO C forbids zero-size array 'array' : 這樣做會導致未定義行為! 程式會怎麼掛沒人保證; 而不是會怎麼 : 跑沒人保證... 先說明清楚,沒事大家的確不要這樣寫比較好。這裡會很龜毛的討論標準的 技術細節,沒興趣的請按左鍵離開 xD 懶得看標準的只需記得「不要這樣寫!」 標準沒有很清楚的說明 int array[0]; 是未定義。我猜誤以為標準有非常清 楚說明的的人是因為讀到這句: C99+TC1/2/3 n1256 4/1 If a "shall" or "shall not" requirement that appears outside of a constraint is violated, the behavior is undefined. ... 注意有個但書「outside of a constraint」 C99+TC1/2/3 n1256 6.7.5.2/1 注意這是一條 constraint!!! ... If the expression is a constant expression, it shall have a value greater than zero. ... 所以其實標準沒有很清楚說這是「未定義」。反而標準要求編譯器要有錯誤 訊息才行。程式違反 constraint 的話編譯器是有責任提醒的: C99+TC1/2/3 n1256 5.1.1.3/1 A conforming implementation shall produce at least one diagnostic message (identified in an implementation-defined manner) if a pre- processing translation unit or translation unit contains a violation of any syntax rule or constraint, even if the behavior is also explicitly specified as undefined or implementation-defined. 所以要求程式設計師小心的同時,也應注意編譯器有沒有發出錯誤訊息。個 人覺得程式設計師已經夠辛苦了,這種雜事當然丟給編譯器做就好。既然標準有 說要有錯誤訊息,我覺得一點也不需要怪程式設計師,反而要怪為什麼得用這麼 迂迴的方法才印得出錯誤訊息。(如 gcc 4.5.2 連加上-std=c99 -Wall 都不會顯示,得要用如 loveme00835 大大提的 -pedantic) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.39
loveme00835:所謂未定義是指「沒有說這時候應該怎麼做」, 而不是說 06/27 01:58
loveme00835:「這時候你會出錯」 06/27 01:59
loveme00835:因為這有時會明講 behavior is undefined, 但是上面寫 06/27 02:02
loveme00835:的你沒做到, 也是等於這件事情 06/27 02:03
a127a127:唔,看不太懂3、4F那句的意思@_@a。 06/27 02:46
a127a127:看起來即使行為未定義,編譯器也有責任丟一個訊息提醒。 06/27 02:48
a127a127: ^在某些情況下, 06/27 02:49
er... 總之 (1) 標準沒有清楚說未定義 (2) 編譯器要負責提醒這種錯誤 === 感謝 a127 提醒!C 標準對於 constraint 有嚴格定義,跟一般人的用法 不一樣。要怎麼知道是 constraint 呢?以 C99+TC1/2/3 (n1256) p.128 為例: 6.7.5.2 Array declarators Constraints 1 In addition to ... 2 An ordinary identifier ... Semantics 3 ... 4 ... 所以前兩個段落就是 constraints! 裡面出現的 shall 不受到 4/1 的規範。 而其他地方出現的 shall/shall not 只要一違反就是未定義,希望有成功清楚 解釋。先說我討厭標準寫得這麼麻煩,不過它的確是這個意思。 ※ 編輯: Favonia 來自: 140.112.30.39 (06/27 04:24)
a127a127:懂了@_@a,感謝<(_ _)>,所以這根本是有定義的喔 @_@a 06/27 04:25
Favonia:我覺得標準根本沒講清楚。標準的重點在於編譯器要發警告! 06/27 04:28
a127a127:看了一下其他的constraint,好嚴重啊,一違反幾乎就CE了 06/27 05:34
angleevil:c/c++真的是很煩程式語言.尤其是c有好嚴重的歷史包袱 06/27 09:52
yoco315:樓上讓我想到一件很有趣的事情,很多C的信徒覺得C++很dirty 06/27 11:22
yoco315:卻無視這些dirty幾乎都是從C繼承來的這個事實 XD 06/27 11:23
james732:很好奇如果C++完全不理會C的相容性,會是怎樣的語言 XD 06/27 11:23
james732:可惜實際上不可能這麼做... 06/27 11:23
angleevil:一定是很完美的語言,竟然可以忍受c的黑暗包袱 06/27 11:29
littleshan:回樓樓上 請見 http://www.digitalmars.com/d/ 06/27 12:52
james732:D語言算是不理C的C++? 之前沒有深入研究過...XD 06/27 12:55
※ 編輯: Favonia 來自: 140.112.30.39 (06/27 12:58)
angleevil:沒深入研究,但是覺得不太算. 06/27 14:00
yoco315:之前有花一點時間摸了一下,覺得是很不錯的語言,拿掉了很多 06/27 15:25
yoco315:缺點,加進了一些C++沒有的優點,不過後來C++0x越來越讓人期 06/27 15:26
yoco315:待,且golang的型別系統也讓人很喜歡,然後就不鳥d了 QQ 06/27 15:27
loveme00835:XD 06/27 15:45
littleshan:我倒是看過 D 2.0 後就對 C++0x 不抱期望了 06/27 16:48
angleevil:~"~ 我的錯覺嘛? 我記得wiki沒有很稱讚D阿 06/27 17:49
purpose:嫌貨才是買貨人,沒人用的東西就不會有人嫌 06/27 17:52
yoco315:是喔,那我也來看一下2.0,竟然前輩這麼推 06/27 17:57
yoco315:真的是很優秀的語言, 真替她難過 QQ 06/27 18:16
loveme00835:C++: Q口Q 06/27 18:33
xatier: C++: Q口Q 06/27 18:38
angleevil:誰叫c++還不肯離開c.c++98版本後,早就可以自立門戶 06/27 20:47
angleevil:要不是跨平台的問題. 06/27 20:48
littleshan:C++要是離開C就不會有人用了,因為舊的code無法編 06/27 22:18
yoco315:小善是對的 06/28 09:15
stosto:C++離開C後 C++使用者會很開心的 06/29 00:08
james732:不過真正的C++使用者應該不太多....XD 06/29 00:11
yoco315:james是對的 06/29 16:19
angleevil:可能要先定義真正的意思 06/29 17:24