2013-10-06 70 views
0

我想聲明一個C宏,它是根據傳遞給宏的參數定義的。換句話說,我想在C宏中使用#if指令。它應該是這樣的:我可以在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; 
} 

然而,它似乎不允許使用#if指令在C宏。有沒有辦法做到這一點?

+2

沒有,你可以不在預處理器宏中定義預處理器宏。 – 2013-10-06 08:10:30

+0

不僅你不能這樣做,預處理階段也不知道類型。它只知道令牌序列。也許你應該告訴我們你想達到什麼目的? –

+0

我不這麼認爲。 –

回答

1

不,你不能。語言的定義不允許這樣做。編譯器也不支持這一點。

C預處理器被指責爲太複雜。現代語言不使用類似的功能。將來出現的問題不太可能出現。

儘管如此,從我的角度來看,你所要求的不是特別糟糕。我正在考慮在自己的解析器中實現它,但後來放棄了。

0

如果這是真的只有一小部分的類型(這裏我用bridgetoto),所有的都用一個令牌標識符標識,你可以用一些逃脫像

#define XLTypeCastToVoidPointer(T) XLTypeCast_ ## T 
#define XLTypeCast_bridge(X) (bridge)(X) 
#define XLTypeCast_toto(X) *((toto*)(X)) 
相關問題