學生在qq群中貼圖:
他說:“老師這個不報錯。”
細看,定義數組時:
這不科學,定義數組時,元素個數用變量,沒有這麼玩的!
有人跟上了:“我一直這麼用!”
這還了得,十幾年的修行,就這麼塌了。c和c++一直在規定數組定義時,元素個數必須能确定。作為人工語言,就這麼規定的,也在各種編譯器中得到了貫徹。
學生猜測:“codeblocks 13.12的新支援?”
我隻能先澄清:“不是13.12的事。codeblocks給了個殼,編譯的活是gcc幹的。難道是某版本gcc放松要求了?苦逼的計算機老師,就這麼被坑了。誰查查資料,考證一下。搞清楚前,即使允許,也按規矩來。”
這算是一個解釋。
記吃不記打。去年的學生提到過的問題,我做過初探,居然也忘記了。
菜鳥的優秀品質就在于由于不知而無畏,可以撞到各種錯。這實際上,是原生學習力中的重要部分。一個有程式設計功底的人,看了書上講的,會很快了解,并自覺不去這樣做。這樣的問題,不會由有經驗者發現。
為和菜鳥們厮混而自豪。
今年想将工作推進一步。查了iso/iec14882(c++語言的國際标準)在1998年和2011年出的兩個版本,在8.3.4小節都強調了定義數組時,要用常量!
寫了下面的程式,在codeblocks13.12下調試,編譯器是gcc 4.7.1。
居然連個警告都沒有!
還讓不讓人教c++了。學院在改培養方案,明年不會給大一的教c++了,教c。
再查,說這種寬松是由c99而來的。找到iso/iec 9899:tc2(c語言标準)6.7.5.2小節中,果然有這樣的規定。
決定不再考證。如何在codeblocks中讓這樣的程式不能通過呢?
改設定。
找codeblocks13.12的菜單setting->compiler...,
打勾的設定要求用嚴格的iso标準提出警告。
再編譯程式,終于來了警告:
d:\cpp\codeblock\example\main.cpp|7|warning: iso c++ forbids variable length array 'a' [-wvla]|
再想讓報出錯來,沒有找到設定。換一種編譯器,一定能得逞。不折騰了。
想知道,在企業中是如何處理這件事情的。找到了《google c++ 程式設計規範.pdf》,下面是截圖:
我不知道所謂變長數組的确切定義,但是啟示卻很明白,老老實實地按正常寫程式。在這方面,不必緊跟放松了的規定。