2016-06-07 111 views
5

我編寫了一段代碼並通過QA C進行分析,但它顯示警告'x'具有外部鏈接,並且正在定義之前沒有任何先前的聲明。請幫助我理解這一點。C代碼中的QA警告消息

代碼:

#include <stdio.h> 
int x; 
void main() 
{ 
} 
+0

謝謝@gregor – Santz

+1

[重新打開](http://stackoverflow.com/posts/37672587/revisions)的任何具體原因? [有什麼具體的標記重複丟失了嗎?](http://stackoverflow.com/q/5110055/2173917) –

+0

QA C是否設置爲每次機會檢查MISRA合規性? – Lundin

回答

5

該工具正確地警告您不要使用錯誤的編程習慣。我懷疑這是因爲你已經設置了靜態分析器來檢查MISRA-C的符合性。

所有MISRA-C首先不允許「全局」變量,MISRA-C:

功能和對象不應該與如果 他們只在引用外部鏈接的定義:2012第8.7條規則翻譯單位。

這個變量的含義是staticextern

前者是有道理的,後者幾乎總是非常糟糕的編程習慣(除了一些例外,像一些const變量)。現在

,如果你打算有這個變量extern,然後還有另一個規則,這是有可能的錯誤,MISRA-C的原因:2012第8.4條規則:

兼容的聲明應是可見的時定義了具有外部鏈接的對象或功能 。

這意味着對於符合MISRA,您需要在同一個翻譯單元內可見extern聲明extern int x。 MISRA建議將它放在一個頭文件中。

同時請注意,不好這樣的代碼被標記的標準過時,並在C未來版本可能無法正常工作,請參見C11 6.11.2:

標識符

6.11.2的聯繫

在沒有靜態存儲類 說明符的文件範圍內聲明具有內部鏈接的標識符是過時的功能。

即使它不是用C標記爲過時的做法,你還是應該始終避免全局變量和extern,因爲這是走向麪條編程和意大利麪緊密耦合。完全考慮一個不同的程序設計。

6

它的意思是,x可能是可訪問的外部含有上述代碼翻譯單元。所以其價值可能被其他翻譯單位改變。

因此,編譯器警告您可能會失去程序穩定性。

房間裏的大象。修復非便攜式void main()原型。使用int main()。漂亮,請在糖上面。

+0

這不是一頭大象,它是一匹死馬...如果OP的代碼是用於嵌入式系統的,那麼這種主要格式就是完美的,便攜的。 [見此](http://stackoverflow.com/a/31263079/584518)。此外,QA C不是編譯器,而是靜態分析器。 – Lundin