簡體   English   中英

這是使用宏的好方法嗎?

[英]Is this a good way to use macros?

我知道宏的陷阱 ,並在我真正想要的是函數時避免使用它們。

不過,我發現它們對於存儲“魔術”數字,文件名,字體名稱等有用。 這樣的事情:

ProjectHeader.h

#ifndef __PROJECT_HEADER__
#define __PROJECT_HEADER__

#define kXMLFileName "scoresAndSettings.xml"

#define AUDIO_DATA_TYPE_FORMAT SInt16
#define NUM_AUDIO_BUFFERS 3
#define AUDIO_SAMPLE_RATE 44100.
#define NUM_AUDIO_CHANNELS 2

#define kGameFont @"Helvetica-Bold"
#define kGameFontSizeNormal 18
#define kGameFontSizeSmall 16
#define kGameFontSizeTiny 11

這些使我(a)將UI細節存儲在一個可以更改它們的地方,並且知道更改將在整個代碼中傳播,(b)為它們指定一個名稱,以描述其在代碼中的功能,並且(c)使用代碼自動完成功能知道我實際上輸入了正確的術語。

我非常有信心,這不是一個糟糕的工作方式,但是我想知道是否有人認為是這樣,以及如何更好地做到這一點。

這些也許有點笨拙,但我仍然發現它們非常有幫助:

#define __COPY_PROTECTION__
#define __SHOW_FPS__ NO
#define __SKIP_LAUNCH_SCREEN__ 0
#define __START_IN_GAMEPLAY__ 1
#define __START_IN_PREFS__ 0
#define __START_IN_WIN_SCENE__ 0
#define __AUTO_WIN_TESTING__ 0

(然后,在代碼中的各個方面:

AppDelegate.h
if (__START_IN_GAMEPLAY__) {
 [self show:MyGameplay];
 return;
}
[self show:MainScreen];

)。 通過僅處理ProjectHeader.h文件中的#define宏,這使我可以直接進入測試項目的任何部分的工作。

這個好嗎? 壞? 下次有更好的方法嗎?

首先,至少在C ++中,第一組宏中沒有什么比const變量更好的了:

char const kXMLFileName[] = "socresAndSettings.xml";
typedef SInt16 audioDataTypeFormat;
int const numAudioBuffers = 3;
//  ...

使用const而不是宏的好處是名稱將遵守范圍; 對於數值,還有一個優點是您可以更輕松地指定類型(如果不是int )。 在濫用情況下,錯誤消息通常也更容易理解。

對於第二個塊,很難說(但是您選擇的名稱會導致未定義的行為)。 我的印象是這些將用於條件補全。 如果是這樣,則它們必須是宏。 但是總的來說,除非您的目標是混淆,否則應避免使用條件編譯。

這並不是說您永遠不要使用宏。 例如,沒有其他方法可以在日志原語中自動插入__FILE____LINE__ 在與Python或其他定義C API的語言進行交互時,我也廣泛使用了它們:在C API中,“重載”是通過手動名稱處理完成的,並且將令牌粘貼到宏中是實現這一目標的唯一簡便方法這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM