3

コンパイル時に次のことを行う方法はありますか?

int anInteger = 0;
__if_object(anInteger) {
    // send object some messages
}
__if_primitive(anInteger) {
    // do something else
}

これを使用できるダミーの状況は、以下の__add_macroを定義することです。

#define __add_macro(var, val) __something_goes_here__

int i = 1;
MyInteger* num = [[MyNumber alloc] initWithValue:1]

__add_macro(i, 4);
__add_macro(num, 4);

// both should now hold 5

明確化/簡素化

1つのマクロでこれを行う方法はないと思います。ただし、マクロが間違ったデータ型で使用されている場合に警告する必要があります。これらの2つのタイプは次のとおりです:objectおよびnon-object)。

それがオブジェクトであるかどうかを確認するには、これが機能します。

#define __warn_if_not_object(var) if(0){[(var) class];}

必要なもの:

#define _warn_if_object(var) if(0){__something_here__}

繰り返しますが、これはコンパイル時に発生する必要があります。また、エラーまたは警告をスローする可能性があります。

ありがとう

4

2 に答える 2

5

変数を宣言するとき、int実際には値を入れることしかできませんint

これはObjective-C、つまりCであるため、存在するほぼすべてのタイプの保護メカニズムをバイパスできますが、これはお勧めできません。実際、たとえば、NSNumber参照が変数に収まるという保証はありませんint。警告をバイパスしようとすると、一部のビットが破棄されて参照が無効になる可能性が十分にあります。

したがって、いいえ、オブジェクト参照がどのクラスを参照しているかはわかりますが、一般に、変数に整数値が含まれているか、オブジェクト参照が含まれているかはわかりません。これら2つの非常に異なるものを同じ変数。

回答2

パトリック、あなたのコメントと説明は、質問が最初に質問することから始めようとしているのではなく(anの値がオブジェクトであるかどうかをどのように判断するかint-上記の回答ではありません)、かなり異なることを示唆しているようです。 ..

あなたが求めているのは関数のオーバーロードだと思います。マクロを使おうとしているように見えるので、おそらくインライン関数もそうです。Clangは関数のオーバーロードをサポートしています。問題を解決する方法を示すプログラムフラグメントを次に示します。

// Clang likes prototypes so let's give it some
// The following declares two overloaded inline functions:
NS_INLINE void __attribute__((overloadable)) byType(int x);
NS_INLINE void __attribute__((overloadable)) byType(NSNumber *x);

// now some simple definitions:
NS_INLINE void __attribute__((overloadable)) byType(int x)
{
   NSLog(@"int version called: %d", x);
}

NS_INLINE void __attribute__((overloadable)) byType(NSNumber *x)
{
   NSLog(@"NSNumber version called: %@", x);
}

// now call them, automatically selecting the right function
// based on the argument type
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
   int x = 5;
   NSNumber *y = [NSNumber numberWithInt:42];

   byType(x);
   byType(y);
}

出力を実行するときの上記のコード:

int version called: 5
NSNumber version called: 42

Clang 3は、2つの呼び出しをインライン化する上記のコードをコンパイルするため、マクロを使用する場合と同じコードを取得します。

于 2012-06-01T04:56:06.380 に答える
0

スカラー値とオブジェクトへのポインタを混在させないでください...うまく終了しません。

あなたが主張するなら、あなたはObjective-C++で何かをすることができます

何かのようなもの

int sum(int,int);
NSNumber * sum(NSNumber *, NSNumber *);
于 2012-06-01T18:59:09.500 に答える