C99 permet initializers de matrice (entre autres) pour spécifier quel élément de la matrice est en cours réglé avec un indicateur de nombre entier positif (6.7.8.6 $, 6.7.8.17 $), par exemple comme ceci:codes dans c89
const char *foo[] = {[2] = "foo", [1] = "bar", [0] = "baz"};
Je l'ai déjà utilisé cela pour faire une table ENUM à cordes comme ceci:
enum {THING_FOO = 0, THING_BAR, THING_BAZ};
const char *table[] = {
[THING_FOO] = "foo",
[THING_BAR] = "bar",
[THING_BAZ] = "baz"
}
Cependant, je travaille maintenant sous la condition que mon code est conforme à C89. J'ai examiné la magie du préprocesseur (comme dans here, par exemple) mais j'ai besoin que les chaînes soient arbitraires, pas les copies des symboles enum.
Il ne suffit pas de faire juste
enum {THING_FOO = 0, THING_BAR, THING_BAZ};
const char *table[] = {"foo", "bar", "baz"};
parce que je vais devoir ajouter des éléments de ENUM à l'avenir. En utilisant la méthode c99, cela se traduirait par des pointeurs NULL dans la table qui sont facilement acceptables pour le débogage s'ils deviennent des problèmes. Si j'ai oublié de mettre à jour la table de chaînes en utilisant cette méthode, j'obtiendrais des segfaults qui sont plus difficiles à déboguer. De plus, il est inutile d'avoir des symboles si je dois me souvenir des décalages de toute façon.
Si la déclaration était en fonction, je pourrais obtenir l'effet désiré comme ceci:
enum {THING_FOO = 0, THING_BAR, THING_BAZ, NUM_THINGS};
void foo(void)
{
static const char *table[NUM_THINGS];
table[THING_FOO] = "foo";
table[THING_BAR] = "bar";
table[THING_BAZ] = "baz";
/* ... */
}
Cependant, au moins avec gcc
, cela ne pas obtenir optimisé.
Existe-t-il un moyen de déclarer une telle table de chaînes dans c89? (Il n'y a pas de problème dans l'assemblage.)
Possible copie de [Comment convertir les noms d'enum en chaîne en c] (http://stackoverflow.com/questions/9907160/how-to-convert-enum-names-to-string-in-c) – Leandros
De nombreuses façons, choisissez la façon dont vous pensez que c'est la manière la moins laide. Il y a beaucoup, beaucoup de façons, l'une pire que l'autre. – Leandros
À votre question, rien d'aussi élégant que C99 ou plus tard ne laissera les lacunes que vous exploitez entre les valeurs enum. Je suis un peu confus, cependant. Puisque vous avez clairement besoin de changer le code de toute façon, lequel, selon vous, prendrait * moins * de temps: une "énorme déclaration de changement", ou postez-vous cette question, et * encore * vous devez changer le code partout? – WhozCraig