c++ - 这是使用宏的好方法吗?

标签 c++ objective-c language-agnostic macros styles

我知道 pitfalls宏并在我真正想要的是一个函数时避免使用它们。

不过,我发现它们有帮助的是存储“神奇”数字、文件名、字体名称等内容。所以像这样:

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 文件中的宏 #defined。

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

最佳答案

首先,您的第一组宏中没有任何内容不会 最好用 const 变量来完成,至少在 C++ 中是这样:

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

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

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

这并不是说您永远不应该使用宏。没有别的 在日志记录中自动插入 __FILE____LINE__ 的方法 例如,原语。我也广泛使用过它们 与 Python 或其他定义 C API 的语言的接口(interface):在 C API,“重载”是通过手动名称修改和 token 粘贴完成的 宏是实现这一目标的唯一简单方法。

关于c++ - 这是使用宏的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10784155/

相关文章:

c++ - 从 Python 调用 IB API

objective-c - 如何在 clang 中使用 __weak 引用?

language-agnostic - 根据供需调整价格的简单公式

ios - 在iOS中上传之前如何压缩视频数据

language-agnostic - 固件开发入门

language-agnostic - 如何用堆栈模拟递归?

C++循环数据结构

c++ - 模板结构的静态常量成员的不同值

c++ - 两个二维数组,两个矩阵,一个文件

ios - 使用 CGImageCreate 调整图像大小以减少内存使用