繁体   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