0

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

#define XLType_id 1

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

我想使用XLTypeCastToVoidPointer()andXLTypeCast()宏来重新转换(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;
}

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

4

2 回答 2

1

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

C 预处理器被指责过于复杂。现代语言不使用类似的功能。你问的东西将来不太可能出现。

尽管如此,从我的角度来看,您所问的问题并没有什么特别不好的地方。我正在考虑在我自己的解析器中实现这一点,但后来放弃了。

于 2013-10-06T08:10:01.567 回答
0

如果这真的只是关于一小部分类型(这里我使用bridgeand toto),它们都用一个令牌标识符标识,你可以摆脱类似的东西

#define XLTypeCastToVoidPointer(T) XLTypeCast_ ## T
#define XLTypeCast_bridge(X) (bridge)(X)
#define XLTypeCast_toto(X) *((toto*)(X))
于 2013-10-06T08:24:14.140 回答