如何返回变量名并指定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"));
您不能在运行时使用宏。
你应该使用一个数组。