我想声明一个根据传递给宏的参数定义的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
指令。有没有办法做到这一点?
答案 0 :(得分:1)
C预处理器因太复杂而受到指责。现代语言不使用类似的功能。你所要求的东西在将来出现的可能性极小。
然而,从我的观点来看,你提出的问题并没有什么不妥。我正在考虑在我自己的解析器中实现它,但后来放弃了。
答案 1 :(得分:0)
如果这只是一小部分类型(我在这里使用bridge
和toto
),那么所有类型都用一个令牌标识符标识,你可以通过
#define XLTypeCastToVoidPointer(T) XLTypeCast_ ## T
#define XLTypeCast_bridge(X) (bridge)(X)
#define XLTypeCast_toto(X) *((toto*)(X))