我可以在C宏中使用#if指令吗?

时间:2013-10-06 08:07:45

标签: objective-c c macros

我想声明一个根据传递给宏的参数定义的C宏。换句话说,我想在C宏中使用#if指令。它应该是这样的:

#define XLType_id 1

#define XLTypeCastToVoidPointer(type) #if XLType_##type \\
(__bridge void *)\\
#define XLTypeCast(type) (__bridge id)\\
#else \\
&\\
#define XLTypeCast(type) *(type*)\\
#endif

我想使用XLTypeCastToVoidPointer()XLTypeCast()宏重新投射(void *)类型的变量。

- (NSInteger) value{
    NSInteger returnValue = 100;

    // the same as -> void *aValueToReturn = &returnValue;
    void *aValueToReturn = XLTypeCastToVoidPointer(NSInteger) returnValue;

    // Do something with this void pointer here.

    // the same as -> return *(NSInteger*) aValueToReturn;
    return XLTypeCast(NSInteger) aValueToReturn;
}


- (NSString*)string{
    NSString* aString = @"a string";

    // the same as -> void *aValueToReturn = &returnValue;
    void *aValueToReturn = XLTypeCastToVoidPointer(id) aString;

    // Do something with this void pointer here.

    // the same as -> return *(NSInteger*) aValueToReturn;
    return XLTypeCast(id) aString;
}

但是,似乎不允许在C宏中使用#if指令。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

不,你不能。语言的定义不允许这样做。编译器也不支持这一点。

C预处理器因太复杂而受到指责。现代语言不使用类似的功能。你所要求的东西在将来出现的可能性极小。

然而,从我的观点来看,你提出的问题并没有什么不妥。我正在考虑在我自己的解析器中实现它,但后来放弃了。

答案 1 :(得分:0)

如果这只是一小部分类型(我在这里使用bridgetoto),那么所有类型都用一个令牌标识符标识,你可以通过

#define XLTypeCastToVoidPointer(T) XLTypeCast_ ## T
#define XLTypeCast_bridge(X) (bridge)(X)
#define XLTypeCast_toto(X) *((toto*)(X))