如何返回一个变量名,分配在C返回的变量的值(How to return a variable nam

2019-09-28 19:04发布

我想用一个动态的变量,其值在运行时会有所不同。

例如

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; 

...但我怎么能得到变量的值命名的?

Answer 1:

这里简单的回答是,这是不可能的C.

较长的答案是,这需要一种语言,这恐怕是一般只出现在脚本语言如Python自省和动态特性。 即使有做这样的事情,不鼓励。

我建议你重新考虑你正在努力解决,并检查是否有可能不是一个更好的方法来处理它的问题。 也许使用数组,映射或哈希表可能是一种替代方法,为你工作。



Answer 2:

C不是一种动态的语言 - 你不能真正做到这一点。 你最好只求更好使用某种类型的数据结构,如字典(key-value存储,关联数组,但是你怎么称呼它),用于这一目的。

那么,除非......除非你有这样邪恶的动态加载一个POSIX符合的系统和你。

#include <dlfcn.h>
#include <stdio.h>

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指出的那样,你也可以做到这一点在Windows上,如果你替换void *ptr = GetProcAddress(GetModuleHandle(NULL), name); 代替void *ptr = dlsym(RTLD_SELF, name);



Answer 3:

你不能直接下做到这一点

你可以做这样的事情但是:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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"));


Answer 4:

运行过程中不能使用宏。

您应该使用数组。



文章来源: How to return a variable name and assign the value of the variable returned in c