Objective c 我可以在C宏中使用#if指令吗?
我想声明一个C宏,它是根据传递给宏的参数定义的。换句话说,我想在C宏中使用Objective c 我可以在C宏中使用#if指令吗?,objective-c,c,macros,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*)\\ #endi
#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
指令。有什么方法可以做到这一点吗?不,你不能。语言的定义不允许这样做。编译器也不支持这一点
C预处理器被指责过于复杂。现代语言不使用类似的功能。你所要求的东西将来出现的可能性很小
然而,从我的观点来看,你的要求没有什么特别糟糕的错误。我曾考虑在我自己的解析器中实现这一点,但后来放弃了。如果这只是关于一小部分类型(这里我使用
桥和toto
),所有这些类型都由一个令牌标识符标识,那么您可以使用类似
#define XLTypeCastToVoidPointer(T) XLTypeCast_ ## T
#define XLTypeCast_bridge(X) (bridge)(X)
#define XLTypeCast_toto(X) *((toto*)(X))
不,不能在预处理器宏中定义预处理器宏。不仅不能这样做,预处理阶段也对类型一无所知。它只知道令牌序列。也许你应该告诉我们你到底想要实现什么?在这里输入一个void*
对我来说是完全多余的。在C中,void*
隐式转换为任何其他数据指针,不会出现问题。(我的猜测是,在objective-C中,这是相同的,但我不是这方面的专家。)