2012-12-16 3 views
3

Y a-t-il un opérateur opposé pour @encode? Par exemple, lorsque vous faites cela: @encode(int), vous obtenez "i".J'aimerais pouvoir faire ceci: @decode("i") myInt = 5;À l'opposé de @encode

Est-ce possible? Existe-t-il un opérateur pour gérer cela?

+2

En bas de ce chemin se trouve la folie. Les langages dérivés de C et C ne sont pas vraiment conçus pour ce type de comportements dynamiques et introspectifs. – bbum

+0

C'est en quelque sorte possible de le faire, si vous voulez jouer avec libffi: [Mike Ash sur trampoline dans Blocks] (http://www.mikeash.com/pyblog/friday-qa-2011-05-06-a -tour-of-mablockclosure.html), mais vous ne pouvez pas déclarer une variable à la compilation en fonction du type d'une autre variable. –

Répondre

6

n ° @encode prend un type, et en C, il n'est pas possible de retourner un type. (L'opérateur typeof() est une extension GNU, mais il ne prend pas de chaîne C.

Vous avez deux options: Une: redéfinir votre code Si vous en avez besoin, vous avez probablement problème de conception.

Deux, utiliser l'allocation dynamique de la mémoire et écrire votre propre fonction qui prend une chaîne de type et alloue de la mémoire en conséquence.

-1

humm, oui .. il y a certainement, est ...

  int five = 5; 
__typeof(five) four = 4; 

printf("@encode(int):%s\n", @encode(int)); 
printf("typeof(five):%s\n", @encode(__typeof(five))); 
printf("typeof(four):%s\n", @encode(__typeof(four))); 

@encode(int):i

typeof(five):i

typeof(four):i

0

Vous pouvez utiliser NSGetSizeAndAlignment pour obtenir la taille et faire l'allocation.

NSUInteger size; 
NSGetSizeAndAlignment(encoding, &size, NULL); 
void* ptr = malloc(size); 

if (strcmp(encoding, @encode(int)) == 0) { 
    *(int*)ptr += 2; 
} else if (strcmp(encoding, @encode(float)) == 0) { 
    *(float*)ptr += 2.0; 
} 

free(ptr);