2013-10-06 2 views
0

Я хочу объявить макрос C, который был определен в соответствии с параметром, переданным макросу. Другими словами, я хочу использовать директиву #if в макросе 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() и 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

Не только то, что вы не можете сделать это так, фаза предварительной обработки также ничего не знает о типах. Он знает только о последовательностях токенов. Возможно, вы должны сказать нам, чего именно вы хотите достичь? –

+0

Я так не думаю. –

ответ

1

Нет, вы не можете. Определение языка не позволяет этого. Составители также не поддерживают это.

Препроцессор C обвиняется в том, что он слишком сложный. Современные языки не используют аналогичные функции. Очень маловероятно, что что-то, что вы спросите, появится в будущем.

Тем не менее, с моей точки зрения, нет ничего плохого в том, что плохого в том, что вы просите. Я думал об осуществлении этого в своем собственном парсере, но позже сдался.

0

Если это действительно только небольшой набор типов (здесь я использую bridge и toto), что все идентифицируются с одним лексем идентификатором, вы можете уйти с чем-то вроде

#define XLTypeCastToVoidPointer(T) XLTypeCast_ ## T 
#define XLTypeCast_bridge(X) (bridge)(X) 
#define XLTypeCast_toto(X) *((toto*)(X)) 
Смежные вопросы