我遇到一些奇怪的行爲(當然,我想這是有解釋),同時試圖交叉編譯一些文件從Debian的一個臂Linux目標,使用:C交叉編譯器鏈接extern聲明爲靜態?
$ arm-linux-gnueabi-gcc --version
$ arm-linux-gnueabi-gcc (Debian 4.3.5-4) 4.3.5
在編譯時我得到這些錯誤消息:
dsblock1.c:167: error: non-static declaration of ‘HaveEventIterated_’ follows static declaration
ss2dym.c:778: error: previous declaration of ‘HaveEventIterated_’ was here
相對應的線:
ss2dym.c:778 :
extern long HaveEventIterated_;
"redeclaration" dsblock1.c:167:
long HaveEventIterated_=0;
因此,這裏是我沒有得到的東西: 根據我以爲我知道的東西,變量首先聲明爲extern,是非靜態的。
但是:「extern」聲明在靜態函數中。 所以我的猜測是,這是某種繼承行爲?!
所以,這裏是問題: - 有人可以解釋背景故事,如果我的猜測是正確的? - 有沒有一種簡單的方法來解決這個問題,例如用一個棘手的編譯器標誌,允許嵌套的範圍轉移或其他魔術?
我知道它很可能會創建一個頭並將所有這些extern聲明放到中性空間,但是我已經有了幾百個這樣的錯誤和幾個文件。我已經看到,這段代碼使用MSVC++編譯得很好(它有其他的作用域約束,我知道,但使用arm-g ++時我有更多的問題),所以必須有某種解決方案,比重寫所有這些部分更容易...
BTW:有改變這一切的「重聲明」的範圍一個簡單的方法,因爲我已經在所有的人面前宏喜歡:
MY_MACRO long HaveEventIterated_=0;
和ATM我-DMY_MACRO=
編譯
Soooo any? :)
它確實是那麼簡單......「第三」聲明謝謝! – beneeng
好解釋+1 – fayyazkl