char whatVar[] = "";
float phValue, ecValue, tempValue;
我不确定这在 C 中是否可行。每个浮点值都将随机设置。我想根据 char whatVar 对应的内容来设置它们的值。例如,假设char whatVar[] = "phValue";
我如何指向 whatVar 中的变量名然后设置值?我想在不使用 if 条件或开关的情况下实现这一点。
不; 使用数组。将程序逻辑与变量名称联系起来是一个可怕的想法。变量名的存在可以帮助程序员了解代码在做什么。除此之外,不(也不应该)有任何意义。
相反,请使用索引/存储桶/映射/任何具有逻辑意义的集合。初学者完全按照自己的意愿去做是很常见的,但这几乎可以肯定是个坏主意。听起来你想要一个字符串-> 浮动映射或哈希表。
您将不得不手动whatVar
实现对实际变量值的转换。C 语言没有这种直接的特性。
它可以通过if/switch
梯子完成。或者它可以通过预先构建一个表来完成,该表将变量名称“投影”(映射)到变量地址(以及,如果需要,类型)。您将不得不手动搜索表格。它仍然会有if
's ,除非你为你的名字开发某种 [最小] 完美的散列函数(参见 Steve Jessop 的评论)。
为什么不 ?
if(strcmp(whatVar, "phValue") == 0)
{
phvalue = 3; //some value
}
等等等等。
编辑:如果不需要if
s 和 the switch
,那么我们可以在字符串表示之间使用某种map
字符串作为键,将它们的变量作为值。
这超出了语言规范,我认为如果这是您希望在该语言中具有的功能,另一种具有这种功能的语言对您来说会更有用。
我能想到实现这一点的唯一方法是做一些预处理技巧,这似乎是个坏主意。使用这种方法,您将不会在代码中拥有 if's 它本身,而是一些非常难以维护的预处理。
如果你真的想这样做,你可以使用这个dlsym
函数(只要你访问的变量是全局的)。这是一个简单的例子:
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
float phValue, ecValue, tempValue;
int main(int argc, char *argv[]) {
int i;
phValue = 0;
ecValue = 0;
tempValue = 0;
printf("Before:\n");
printf("\tphValue = %f\n", phValue);
printf("\tecValue = %f\n", ecValue);
printf("\ttempValue = %f\n", tempValue);
for(i = 1; i < argc; i += 2) {
float *varptr = (float *)dlsym(RTLD_MAIN_ONLY, argv[i]);
*varptr = atof(argv[i+1]);
}
printf("\nAfter:\n");
printf("\tphValue = %f\n", phValue);
printf("\tecValue = %f\n", ecValue);
printf("\ttempValue = %f\n", tempValue);
}
还有一个演示:
% gcc varname.c -ldl
% ./a.out phValue 12.1 tempValue 4.3 ecValue 2.2
Before:
phValue = 0.000000
ecValue = 0.000000
tempValue = 0.000000
After:
phValue = 12.100000
ecValue = 2.200000
tempValue = 4.300000