Comment retourner un nom de variable et affecter la valeur de la variable retournée en c

Je souhaite utiliser une variable dynamic dont la valeur variera pendant l’exécution.

par exemple

char * aVar = "ABC"; char * bVar = "DEF"; char * cVar = "XYZ"; char *dVar = NULL; dVar = foo1(); print dVar; 

foo1 appelle en interne foo2 , ce qui devrait renvoyer les noms de variables (comme "aVar" , "bVar" ou "cVar" ). foo1 doit renvoyer la valeur de ladite variable comme indiqué en fonction de la valeur de retour de foo2 .

pour obtenir le nom de variable, nous pouvons utiliser une macro (non standard):

 ##define GET_VAR(varname) #varname; 

… mais comment puis-je obtenir la valeur de la variable nommée?

La réponse simple est que cela n’est pas possible en C.

La réponse plus longue est que cela nécessite une introspection et des fonctionnalités dynamics dans un langage, ce qui n’est généralement visible que dans les langages de script tels que Python. Et même là, faire quelque chose comme ça n’est pas encouragé.

Je vous suggère de reconsidérer le problème que vous essayez de résoudre et de vérifier s’il n’y a pas une meilleure méthode pour l’aborder. Peut-être qu’utiliser un tableau, une carte ou une table de hachage pourrait être une approche alternative qui vous conviendrait.

C n’est pas un langage dynamic – vous ne pouvez pas vraiment faire cela. Vous feriez mieux d’utiliser une sorte de structure de données, telle qu’un dictionnaire (magasin de clés-valeurs, tableau associatif, peu importe comment vous l’appelez) à cette fin.

Eh bien, à moins que … sauf si vous avez un système conforme à POSIX et que vous aimez le chargement dynamic maléfique.

 #include  #include  int globalVarOne = 1; int globalVarTwo = 2; int globalVarThree = 3; int getValueOfVariableNamed(const char *name) { void *ptr = dlsym(RTLD_SELF, name); return *(int *)ptr; } int main() { printf("globalVarOne = %d\n", getValueOfVariableNamed("globalVarOne")); // etc. } 

Impressions:

 globalVarOne = 1 

Notez que cela ne fonctionne que pour les variables globales.

Edit: comme @oldrinb l’a souligné, vous pouvez également le faire sous Windows si vous remplacez void *ptr = GetProcAddress(GetModuleHandle(NULL), name); au lieu de void *ptr = dlsym(RTLD_SELF, name); .

Vous ne pouvez pas le faire directement en C.

Vous pouvez faire quelque chose comme ceci cependant:

 #include  #include  #include  typedef struct Binding { int* pIntVar; const char* IntVarName; struct Binding* pNext; } Binding; Binding* Bindings = NULL; void BindVar(const char* IntVarName, int* pIntVar) { Binding* b; if ((b = malloc(sizeof(Binding))) != NULL) { b->IntVarName = IntVarName; b->pIntVar = pIntVar; b->pNext = NULL; if (Bindings == NULL) { Bindings = b; } else { Binding* bs = Bindings; while (bs->pNext != NULL) { bs = bs->pNext; } bs->pNext = b; } } else { fprintf(stderr, "malloc() failed\n"); exit(-1); } } int* GetVarPtr(const char* IntVarName) { Binding* bs = Bindings; while (bs != NULL) { if (!strcmp(bs->IntVarName, IntVarName)) { return bs->pIntVar; } bs = bs->pNext; } fprintf(stderr, "variable \"%s\" not bound yet!\n", IntVarName); exit(-1); } int main(void) { int ABC = 111, DEF = 222, XYZ = 333; const char* varName = NULL; BindVar("ABC", &ABC); BindVar("DEF", &DEF); BindVar("XYZ", &XYZ); printf("variable \"%s\" = %d\n", "ABC", *GetVarPtr("ABC")); printf("variable \"%s\" = %d\n", "DEF", *GetVarPtr("DEF")); printf("variable \"%s\" = %d\n", "XYZ", *GetVarPtr("XYZ")); // Pick a variable randomly by name switch (rand() % 3) { case 0: varName = "ABC"; break; case 1: varName = "DEF"; break; case 2: varName = "XYZ"; break; } printf("variable \"%s\" (selected randomly) = %d\n", varName, *GetVarPtr(varName)); return 0; } 

Sortie ( ideone ):

 variable "ABC" = 111 variable "DEF" = 222 variable "XYZ" = 333 variable "DEF" (selected randomly) = 222 

Comme GetVarPtr() renvoie un pointeur sur une variable, vous pouvez non seulement obtenir la valeur de la variable, mais également la définir.

Vous pouvez même cacher le pointeur derrière une macro:

 #define VARIABLE(NAME) (*GetVarPtr(NAME)) 

De cette façon, vous pouvez faire des choses comme ceci ( ideone ):

 VARIABLE("ABC") = 1; VARIABLE("DEF") = 2; VARIABLE("XYZ") = 3; printf("variable \"%s\" = %d\n", "ABC", VARIABLE("ABC")); printf("variable \"%s\" = %d\n", "DEF", VARIABLE("DEF")); printf("variable \"%s\" = %d\n", "XYZ", VARIABLE("XYZ")); 

Vous ne pouvez pas utiliser de macros lors de l’exécution.

Vous devriez utiliser un tableau.