这是使用宏的好方法吗?



我知道宏的陷阱,当我真正想要的是一个函数时,我会避免它们。

不过,我发现它们的有用之处在于存储诸如"魔术"数字,文件名,字体名称等内容。所以像这样的事情:

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 d的宏。

这样好吗?坏?下次有更好的方法吗?

首先,您的第一组宏中没有任何东西不会最好使用const变量,至少在C++:

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

使用 const 而不是宏的优点是名称将服从范围;对于数值,还有一个优点是您可以更容易指定类型(如果不是int)。 在误用的情况下,错误消息通常也更容易理解。

对于你的第二个区块,很难说(但你选择的名字导致未定义的行为)。 我的印象是,这些是用于条件提交。 如果是这样,那么它们必须是宏。 但通常,条件编译是要避免的,除非你的目标是混淆。

这并不是说你永远不应该使用宏。 没有其他在日志记录中自动插入__FILE____LINE__的方法例如,基元。 我也广泛使用它们与 Python 或其他定义 C API 的语言接口:在 C 中API,"重载"是通过手动名称重整和令牌粘贴来完成的宏是实现这一目标的唯一简单方法。

相关内容

  • 没有找到相关文章

最新更新