È accettabile usare macro C11 in Objective-C per inserire numeri?

0

Mi stavo stancando di ripetere i tipi scrivendo cose del genere:

NSDictionary* d = @{@"so": [NSNumber numberWithInt:index]),
                    @"much": [NSNumber numberWithBool:accepted]),
                    @"repeat": [NSNumber numberWithDouble:height]};

Quindi ho definito una macro generica (una nuova funzionalità in C11):

#define box(X) _Generic((X), \
char: boxChar, \
unsigned char: boxUnsignedChar, \
short: boxShort, \
unsigned short: boxUnsignedShort, \
int: boxInt, \
unsigned int: boxUnsignedInt, \
long: boxLong, \
unsigned long: boxUnsignedLong, \
long long: boxLongLong, \
unsigned long long: boxUnsignedLongLong, \
float: boxFloat, \
double: boxDouble, \
BOOL: boxBool \
)(X)

... implement type-specific box methods as well ...

In modo che potessi scrivere cose come questa:

NSDictionary* d = @{@"so": box(index),
                    @"much": box(accepted),
                    @"shorter": box(height)};

Questa è una buona idea? Posso aspettarmi che altri siano in grado di costruire il codice? Lo odieranno per non essere standard?

    
posta Craig Gidney 29.11.2013 - 02:26
fonte

2 risposte

4

Quello che stai facendo è già fornito da Objective-C chiamato Boxed Expressions

con esempio tratto dal sito web di llvm

// numbers.
NSNumber *smallestInt = @(-INT_MAX - 1);  // [NSNumber numberWithInt:(-INT_MAX - 1)]
NSNumber *piOverTwo = @(M_PI / 2);        // [NSNumber numberWithDouble:(M_PI / 2)]

// enumerated types.
typedef enum { Red, Green, Blue } Color;
NSNumber *favoriteColor = @(Green);       // [NSNumber numberWithInt:((int)Green)]

// strings.
NSString *path = @(getenv("PATH"));       // [NSString stringWithUTF8String:(getenv("PATH"))]
NSArray *pathComponents = [path componentsSeparatedByString:@":"];
    
risposta data 29.11.2013 - 02:57
fonte
0

Auto-risposta: non mi sono reso conto che in realtà esiste una sintassi standard per farlo. Ho provato @variable prima, ma in realtà dovevo usare @(variable) .

Il che significa che la risposta alla domanda è: sì, lo odieranno. Ma ciò che esiste è comunque meglio.

    
risposta data 29.11.2013 - 02:56
fonte

Leggi altre domande sui tag