Objective-C中const常量是外連接的

    前幾天老師要求實現一個iphone上的“吃豆人”小遊戲,給一下午加一晚上的時間。由於粟的設計很合理,且沒有考慮太多、太複雜的情況(如 pacman 吃了 magic dot 後所有ghost的速度應該變慢),總體上沒遇到什麼太大的困難——只是在開發過程中曾遇到一個很詭異的錯誤:

    爲了遵循DRY原則,我把公用常量(ghost的數量)定義放在了一個define.h文件中,讓大家都去import該文件。

    當時我的常量定義是這樣寫的:

    const int NUMOFGHOST = 4;

    加完這句就出問題了,點擊"build and run"按鈕後報了一個錯誤,打開看後發現是一個從未見過的錯誤:

Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

    當時感覺很不解,不知怎麼加了這一句後gcc會非正常退出,由於時間比較緊就沒有多想,直接改用宏定義了這個常量。

    後來小遊戲做得熱火朝天(各種惡搞,給“吃豆人”加上了dota裏的各種聲音,背景音樂用的是亡靈序曲),也就忘了這個事了。

 

    昨天看《高質量程序設計指南——C++/C語言》看到了C++與C中const關鍵字之不同時頓時想起了那個詭異的問題,同時也找到了答案。

    書中說在標準C中const定義的變量是外連接的,即如果一個編譯單元中定義了一個全局const常量,則其在其他編譯單元中是可見的,如果其他編譯單元也定義了同名const常量就會產生重複定義錯誤。這一點與C++不同,C++中const定義的變量是內連接的,即每個編譯單元定義的全局const常量是自己獨有的。

    Objective-C是標準C的另一種擴展,那麼我犯的錯誤也就很明顯了——當多個編譯單元都引用那個define.h文件時出現了重複定義錯。

    今天來到機房一試,果然如此,只要將

    const int NUMOFGHOST = 4;

改爲

    static const int NUMOFGHOST = 4;

就順利編譯通過了。這裏的static是用來把定義的const常量標記爲對外不可見的。

    這裏順便抱怨一句:這xcode也太不人性化了,重複定義就說重複定義嘛,非要用紅紅的字標出來"Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1",反倒是很重要的那句"ld: duplicate symbol _NUMOFGHOST in /Users/asfgasiyf/Desktop/pacMan/build/pacMan.build/Debug-iphonesimulator/pacMan.build/Objects-normal/i386/MazeView.o and /Users/asfgasiyf/Desktop/pacMan/build/pacMan.build/Debug-iphonesimulator/pacMan.build/Objects-normal/i386/pacManAppDelegate.o"用灰灰的顏色顯示,也不懂得突出一下重點⋯⋯

發佈了35 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章