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

澄清/简化

我想没有办法用一个宏来做到这一点。但是我仍然需要它来警告宏是否用于错误的数据类型。这两种类型是:objectnon-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

帕特里克,你的评论和澄清似乎表明你不是试图通过询问来解决问题的开始(你如何确定 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 编译了上面的代码,内联了两个调用,所以你得到的代码与使用宏的代码相同。

于 2012-06-01T04:56:06.380 回答
0

请不要在标量值和指向对象的指针之间混用......它不会很好地结束。

如果你坚持你可以用 Objective-C++ 做一些事情

就像是

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