2012-06-11 100 views

回答

16

這是因爲ancient debate about goto,無條件分支和意大利麪條代碼,這已經持續了40年左右。 goto,continue,break和多個return陳述都被認爲差不多相同。

世界編程界的共識已大致結束了是這樣的:我們認識到,如果你知道你在做什麼,你可以使用的語言的這些功能,而無需編寫代碼的意大利麪條。但我們仍然不鼓勵他們,因爲很有可能有人不知道他們在做什麼會在可用時使用這些功能,然後創建意大利麪條。我們也勸阻他們,因爲他們是多餘的功能:你顯然可以編寫程序而不使用它們。

由於MISRA-C是旨在實現關鍵系統,MISRA-C:2004年已經禁止儘可能多的這些無條件分支部件儘可能的辦法。因此,goto,continue和多個退貨被禁止。只有在同一個循環內有一次中斷時才允許使用break

但是,在目前正在評估的「MISRA-C:2011」草案中,委員會考慮再次允許所有這些特徵,並且只允許跳轉到下一個跳轉向上。委員會的理由說,現在有工具(即靜態分析器)足夠聰明,可以發現不好的程序流程,因此可以允許關鍵字。

其中goto爭論依然強勁...

5

用C語言編程使得難以跟蹤多個執行分支。如果您在某處分配資源,則必須在其他地方(非本地)釋放它們。如果您的代碼分支,您通常需要爲每個分支單獨使用分配邏輯或退出範圍。

continue聲明增加了另一種方式退出for循環的範圍,從而使得這樣一個循環更難推理和理解控制可以通過它的所有可能的方式,這反過來使其更難確定您的代碼在所有情況下的行爲都是正確的。

這是對我而言只是猜測,但我想,試圖限制從複雜此額外分支行爲來是你提到的規則驅動的原因。

+5

國際海事組織,如果繼續讓一個循環難以理解,那麼循環代碼太長.... –

+0

@MitchWheat:是的。您應該遊說MISRA以添加「無長循環」規則! (但個人而言,在C++中,我發現當用一個簡單的'continue'解析輸入時,可以跳過註釋行,但C++對於「早期退出」慣用語更適合) –

+3

毫無意義:從經驗來看,像他們這樣的編碼標準往往因爲最低的共同標準而被忽略。我在C/C++/C#中繼續使用它是一個非常好的構造。 –

1

與所有MISRA規則,如果你能證明它,你可以從(MISRA-C的4.3.2部分:2004)的規則偏離

MISRA(以及其他類似的指南)背後的要點是要捕捉通常會導致問題的事物......是的,continue可以正確使用,但證據表明它是問題的常見原因。

因此,MISRA創建一個規則,以防止其(AB)的使用,以及評價社區批准的規則。用戶社區的觀點通常支持該規則。

但我重申,如果你真的想使用它,你可以把它證明你的公司的層次結構,偏離。