我有一個代碼庫,我需要得到跨碰到一些這樣的事情的:#define ...方法調用。爲什麼?
#define TimeStamp [NSString stringWithFormat:@"%d",(int)([[NSDate date] timeIntervalSince1970]) ]
爲什麼會有人這樣做,而不是建立在執行的方法?似乎有這樣一件奇怪的事情要做,但必須有一些好處。
我有一個代碼庫,我需要得到跨碰到一些這樣的事情的:#define ...方法調用。爲什麼?
#define TimeStamp [NSString stringWithFormat:@"%d",(int)([[NSDate date] timeIntervalSince1970]) ]
爲什麼會有人這樣做,而不是建立在執行的方法?似乎有這樣一件奇怪的事情要做,但必須有一些好處。
我已經看到了用C做了很多,它只是使代碼內聯,而不是單獨的函數
它消除了調用函數的開銷當函數僅僅是一個線long.It迫使其是內聯的
幾乎任何編譯器都會使這個小的函數內聯,所以沒有一個很好的理由這樣做。更多的是文體選擇。這也很容易出錯
它並沒有真正消除很多開銷(編譯器/鏈接器可以將其刪除)。使用宏是爲了內聯函數可以完成的事情總是不好的。 – 2014-12-01 22:57:13
你不能內聯Objective-C方法,所以除非你把它變成一個實際的函數,否則它不會被內聯,因此會一直髮送一條消息。這樣的代價總是很低,所以真的沒有理由再這樣使用'#define'了。 – 2014-12-01 22:58:05
按High Order Blog: -
在某些情況下宏提供無法通過其他途徑必要的功能。一個例子是,當代碼執行時,您確實需要實際上擁有當前代碼位置的上下文。
例如,我有一個簡單的宏,我有時在調用Objective-C來記錄某些方法被調用時使用。這是可以做到像這樣:
NSLog(@"%@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
這不能被移動到一個Objective-C的方法,因爲它總是會記錄該方法的名稱。 (顯然,它不能移動到C法,因爲沒有可用的自我,沒有_cmd變量。)創建一個宏,這是簡單的,但是:
#define LOG_SELECTOR() NSLog(@"%@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
沒有沒有多大好處,別不使用宏,使用內聯函數。 – 2014-12-01 22:55:52
它獲得了Unix時代的時間戳。我懷疑,因爲它的Unix價值有一種傾向,認爲它應該是一個宏觀。物以類聚,人以羣分。 – 2014-12-01 22:56:24