extern引起的鬧劇

最近一個朋友讓我幫他解決一個問題,因爲源代碼不方便貼出來,因此就本身寫了個demo把問題重現一次app

 

一、新建一個application,添加一個繼承於NSObject的類spa

原本是隨便寫的,就將此類命名爲Object,會出如今控制檯輸出一段文字以下code

Class Object is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/libobjc.A.dylib and /Users/groupfly/Library/Developer/CoreSimulator/Devices/1B7CAB3E-6F13-49EC-B5F7-96CB62C1D5A6/data/Containers/Bundle/Application/60D48F1B-E49D-4D2D-AAD7-A72984CF8CB7/extern.app/extern. One of the two will be used. Which one is undefined.orm

沒有仔細查閱資料,大概意思應該是 libobjc.A.dylib這個庫裏面也有一個已經實現了的Object,二者重複致使的,屬於運行時問題(編譯起來沒問題,不管有沒有在其餘文件中使用,運行以後都會出現這段文字)blog

而後把類型改成NObject繼承

.m文件以下:內存

#import "NObject.h"開發

 extern int mtu;io

@interface NObject ()編譯

@end

@implementation NObject

 + (void)test{

    mtu = 1;  // 通常來講全局變量在聲明的文件中,不會實現

}

@end

二、不少開發者應該都知道,extern是用來聲明全局變量的,通常在聲明文件中,不會被實現,可是從朋友發出來的代碼是公司供應商提供的demo,主要文件中使用到了這個extern關鍵字,而且在此文件中對該變量屢次操做。問題即將出現,當你將此文件導入到本身的項目中時,

#import "ViewController.h"

#import "NObject.h"  // 不管有沒有導入此文件  都會報錯(此文件中聲明瞭全局變量,而且也同時對他進行了操做(複製等)

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {}

@end

這時就會報錯以下圖:

這個報錯是否是有點相似於導入第三方庫時可能會出現的現象

 

三、解決方法:在使用導入後的文件時,引入該全局變量便可:

#import "ViewController.h"

#import "NObject.h"

int mtu ;

@interface ViewController ()

@end

@implementation ViewController...

這樣便可解決報錯

四、查閱資料:

  extern做用: 只是用來獲取全局變量(包括全局靜態變量)的值,不能用於定義變量

  extern工做原理:先在當前文件查找有沒有全局變量,沒有找到,纔會去其餘文件查找。

  // 全局變量:只有一分內存,全部文件共享,與extern聯合使用。

先到這吧,有後續資料再補充。。。

相關文章
相關標籤/搜索