在C语言中获取动态变量

3

我有一个C语言的需求。

char abc[]="hello";
char hello[]="world";

在C语言中,我们是否可以使用abc来获取hello变量的值。 我知道在一些语言中,比如Perl、Php、Bash等,这是可能的。

那么在C语言中,是否也有类似的方法呢?


3
“获取hello变量的值”是什么意思? - Paul R
1
他打算做类似于 ( abc[] )[ ] 的事情。这在 PHP 中是可能的,但在 C 中不行。C 不是动态的! - N 1.1
2
他的意思是使用变量名作为字符串来获取其值。 - erelender
我认为你需要重新措辞这个问题,以使其更清晰明了。也许你可以提供一个Perl或Bash的示例,这样我们就能看出你的意思了? - Douglas Leeder
6个回答

2
没有提供某种字符串查找表,将变量与它们的名称联系起来,在C语言中是不可能实现这一点的。

2

是的,你说得对,在其他语言中可能是可能的,但在C语言中不行, 因为abc是一个容器,它驻留在一个位置(例如:1000),而hello是另一个容器, 它驻留在另一个位置(例如:2000),所以这两个数组之间没有联系,

我们不能使一个值(字符串)指向其他值。 所以最终这是完全不可能的。


1

在C语言中是不可能的,不像Perl或Python等更动态的语言。然而,重要的是要记住,即使在这些语言中也不建议这样做。我还没有看到过一段代码将其用于好的用途。动态语言中可用的eval方法很少使用,也不用于动态获取变量名。


1

一旦C编译器确定了底层指针的存储位置,它就会忘记你给它的名称。动态语言通过像哈希映射这样的数据结构来解决这个问题,允许你将指针(值)存储在一个键(名称)下。

另一个选择是读取调试信息。只有在使用-g(gcc)或其他特定于编译器的选项编译代码时才可用。请注意,调试格式没有标准化,因此您需要弄清楚您的编译器使用的内容以及如何使用它。


0

POSIX有几个函数可以让您这样做,假设变量hello是全局的且不是静态的:

void *handle = dlopen(NULL, RTLD_NOW);
// error handling omitted

printf("%s variable contains value %s", abc, (char *)dlsym(handle, abc));

dlsym() 函数返回值被强制转换为 char *,以抑制使用类似于 printf 的函数时编译器检查格式字符串时出现的警告。

你需要确保已经指定了正确的编译器选项,例如在 GCC 中需要添加 -rdynamic -ldl 参数。


0

在C语言中不可能实现,但在某些情况下可以通过Java的反射机制来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接