0

私はマクロの落とし穴を認識しており、本当に必要なものが関数である場合はマクロを避けます。

ただし、「マジック」ナンバー、ファイル名、フォント名などを保存するのに役立つと思います。次のようなもの:

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 の仕様を変更できる 1 か所に保存し、変更がコード全体に反映されることを確認し、(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];

)。#defineこれにより、ファイル内のマクロ dのみを操作することで、作業中のプロジェクトのどの部分でもすぐにテストに取りかかることがProjectHeader.hできます。

これでいいですか?悪い?次回は何か良い方法はないでしょうか?

4

1 に答える 1

1

constまず、最初のマクロのセットには、少なくとも C++ では、変数を使用したほうがよいものは何もありません。

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

マクロの代わりに使用する利点はconst、名前がスコープに従うことです。数値の場合、型をより簡単に指定できるという利点もあります (そうでない場合int)。誤用の場合、エラーメッセージも一般的により理解しやすくなっています。

2 番目のブロックについては、言うのが難しくなります (ただし、選択した名前によって未定義の動作が発生します)。私の印象では、これらは条件付きのコンパイルに使用されます。もしそうなら、それらはマクロでなければなりません。ただし、一般的に、目的が難読化でない限り、条件付きコンパイルは避けるべきものです。

これは、マクロを絶対に使用してはならないということではありません。たとえば、ロギング プリミティブを__FILE__自動挿入する方法は他にありません。__LINE__また、Python や C API を定義する他の言語に接続する際にも、これらを広く使用しています。C API では、「オーバーロード」は手動の名前マングリングによって行われ、マクロでのトークンの貼り付けが唯一の簡単な方法です。これ。

于 2012-05-28T12:56:58.720 に答える