让我说我有这个功能
void do_work (foo?);
?表示0或1,它将是变量
的值 int bar = 0;
还有变量
int foo0 = 0;
int foo1 = 0;
我试图将一个变量的值注入另一个变量的名称,以便该函数根据前面的逻辑获取任一变量的全名。
我该怎么做?
(在这种情况下,我并不担心好的或坏的做法。)
答案 0 :(得分:4)
C并不像你想的那样工作。您无法在运行时动态引用变量的名称,就像您可能习惯使用其他语言一样。
那就是说,函数参数的名称是无关紧要的。
void do_work(int arg)
{
}
您不必将arg
的名称与foo0
或foo1
相匹配。现在您可以将任一变量传递给函数:
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)
要保留原始的foo1
和foo2
变量,可以设置一个带有指向这些位置的指针的数组,并通过数组中的指针读取/写入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;