如何将变量用于(部分)变量名? (C)

时间:2010-10-14 05:49:27

标签: c

让我说我有这个功能

 void do_work (foo?);

?表示0或1,它将是变量

的值
 int bar = 0;

还有变量

 int foo0 = 0;
 int foo1 = 0;

我试图将一个变量的值注入另一个变量的名称,以便该函数根据前面的逻辑获取任一变量的全名。

我该怎么做?

(在这种情况下,我并不担心好的或坏的做法。)

8 个答案:

答案 0 :(得分:4)

C并不像你想的那样工作。您无法在运行时动态引用变量的名称,就像您可能习惯使用其他语言一样。

那就是说,函数参数的名称是无关紧要的。

void do_work(int arg)
{
} 

您不必将arg的名称与foo0foo1相匹配。现在您可以将任一变量传递给函数:

int foo0, foo1;

if (some_condition)
  do_work(foo0);
else
  do_work(foo1);

现在函数do_work将处理传递的变量的副本。因此,如果更改函数内部的变量值,它将在函数外部保持不变。您可以通过返回新值来更改它:

int do_work(int arg)
{
  return arg + 1;
}

foo0 = do_work(foo0);

最后,听起来你想要使用数组:

int foo[2]; // create two ints: foo[0] and foo[1]

do_work(foo[0]);

int i = 1;
do_work(foo[i]);

答案 1 :(得分:4)

根据@dreamlax的特殊要求:

1)将这些变量声明为

__declspec( dllexport ) static int foo1;
__declspec( dllexport ) static int foo2;

2)使用HANDLE this_module = GetModuleHandle(NULL);获取当前模块

3)获取所需变量的名称:

char vname[100];
sprintf(vname, "foo%d", bar);

4)找到它:

int* fooX = (int*)GetProcAddress(this_module, vname);

5)最后,你可以使用它:

  do_work(fooX);  // or *fooX, as you like

答案 2 :(得分:3)

使用数组或指针代替。您可以使用例如foo[ind]

答案 3 :(得分:2)

使用数组:

int foo[2] = {0, 0};

然后你可以输入

do_work(foo[bar]);

答案 4 :(得分:1)

要保留原始的foo1foo2变量,可以设置一个带有指向这些位置的指针的数组,并通过数组中的指针读取/写入vairables。

int *fooArray[2];
fooArray[0] = &foo0;
fooArray[1] = &foo1;

...然后您可以通过以下方式调用您的函数:

do_work(*fooArray[bar]);

答案 5 :(得分:0)

数组被设计为保存同类数据类型的值,没有人会使用foo0,foo1来满足这种要求

答案 6 :(得分:0)

既然你说你不关心好的或坏的做法,你可以实现你想要的行为而不引入任何新的变量:

if (bar == 0)
    do_work(foo0);
else if (bar == 1)
    do_work(foo1);
else
    puts("Uh oh, unexpected bar value!");

答案 7 :(得分:0)

这对你来说是一个坏主意:

#define foo0 foo[0]
#define foo1 foo[1]
#define foobar foo[bar]

int foo[2];
int bar;