如何返回变量名并指定c中返回的变量的值

我想使用一个动态变量,其值在运行时会发生变化。

例如

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

foo1内部调用foo2 ,它应返回变量名称(如"aVar""bVar""cVar" )。 foo1应该返回根据foo2的返回值命名的所述变量的值。

获取变量名称我们可以使用(非标准)宏:

 ##define GET_VAR(varname) #varname; 

…但是我如何才能获得名为变量的值?

这里简单的答案是在C中这是不可能的。

更长的答案是,这需要在语言中使用内省和动态function,这通常只能在Python等脚本语言中看到。 甚至不鼓励做这样的事情。

我建议您重新考虑您要解决的问题,并检查是否有更好的方法来解决它。 也许使用数组,映射或散列表可能是一种适合您的替代方法。

C不是动态语言 – 你不能真正做到这一点。 为此,您最好使用某种数据结构,例如字典(键值存储,关联数组,但是您可以调用它)。

好吧,除非……除非你有一个符合POSIX标准的系统并且你喜欢邪恶的动态加载。

 #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. } 

打印:

 globalVarOne = 1 

请注意,这仅适用于全局变量。

编辑:正如@oldrinb指出的那样,如果你替换void *ptr = GetProcAddress(GetModuleHandle(NULL), name); ,你也可以在Windows上执行此操作void *ptr = GetProcAddress(GetModuleHandle(NULL), name); 而不是void *ptr = dlsym(RTLD_SELF, name);

你不能直接用C做。

你可以这样做:

 #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; } 

输出( ideone ):

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

由于GetVarPtr()返回一个指向变量的指针,因此您不仅可以获取变量的值,还可以设置它。

你甚至可以隐藏宏后面的指针:

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

通过这种方式,你可以做这样的事情( 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")); 

您不能在运行时使用宏。

你应该使用一个数组。

Interesting Posts