7
votes

Nom d'impression de #define par sa valeur?

J'ai un programme C avec certaines définitions des codes d'erreur. Comme ceci: xxx

est-il possible d'imprimer le nom de la définition par sa valeur? Comme ceci: xxx


2 commentaires

Je pense que non, il est possible de faire quelque chose comme dans C. Peut-être dans une langue avec OOP, comme C # et des reflets.


C Préprocesseur remplace les noms. Vous avez besoin de réflexions. Vous pouvez utiliser des réflexions CERN root.cern.ch/how/how-use-reflex Stackoverflow.com/Questtions/359237/ ...


8 Réponses :


3
votes

Non, ce n'est pas possible. Qu'est-ce que cette impression? XXX


0 commentaires

2
votes

un peu ... xxx

ou: xxx


0 commentaires

1
votes

Pourquoi ne pas choisir d'utiliser une énumération à la place?

enum errors {FILE_NOT_FOUND = -2, FILE_INVALID = -3, INTERNAL_ERROR = -4};

FILE *fp = fopen("file.txt", "r");


if(fp == NULL) {
    printf("Error\n");
    exit(FILE_NOT_FOUND);
}


0 commentaires

6
votes

En bref, non. Le moyen le plus simple de faire ce serait quelque chose comme (veuillez noter: cela suppose que vous ne pouvez jamais avoir une erreur attribuée à zéro / null): xxx pré>

aime! P>

En outre, si vous souhaitez économiser en taper encore plus, vous pouvez utiliser une macro de préprocesseur pour le rendre même nitre: P>

#define NEW_ERROR_TYPE(ERR) {ERR, #ERR}
 const errorType[] = {
      NEW_ERROR_TYPE(FILE_NOT_FOUND),
      NEW_ERROR_TYPE(FILE_INVALID),
      NEW_ERROR_TYPE(INTERNAL_ERROR),
      NEW_ERROR_TYPE(NULL)
    };


0 commentaires

1
votes

pas automatiquement. Le nom perd pendant la compilation et seul le nombre constant reste dans le code.

Mais vous pouvez construire quelque chose comme ceci: xxx

et l'accédez à l'aide de la valeur absolue de la valeur définie comme index.


0 commentaires

1
votes

Utilisez des initialisateurs désignés de C99 pour cela, mais un peu de soins est nécessaire si vos codes d'erreur sont négatifs.

première une version pour valeurs positive: p>

#define CODE(C) [C] = #C

static
char const*const codeArray[] = {
CODE(EONE),
CODE(ETWO),
CODE(ETHREE),
};

enum { maxCode = (sizeof codeArray/ sizeof codeArray[0]) };


0 commentaires

0
votes

C'est comme ça que je le fais dans c:

xxx

xxx

xxx

MAINTENANT, vous pouvez utiliser la macro de commutation déclarée où que ce soit comme celui-ci:

xxx


0 commentaires

4
votes

Vous pouvez faire quelque chose comme ça. XXX


1 commentaires

J'aime mieux cette version car contrairement aux solutions de tableau, il vous donne une erreur de compilation si vous avez des codes d'erreur ambigu / en double.