2012-09-11 99 views
1

例如:像我有一个可变char str[3]="abc";然后我可以使用这个“ABC”作为另一变量(比如一个整数)的名称,这样我可以在abc存储任何值。 如果是,则同时存储在类似这样的“ABC”的值: int abc=123; 我可以引用ABC可变通过str参考呢?在C程序中,我们可以使变量的名称成为变量吗?

+0

没有它不是可能。另外,'char str [3] =“abc”;'是危险的。像这样的“字符串”以null('\ 0')字符结尾。这意味着你需要阵列的宽度至少为4。 – ArjunShankar

+1

[C反射支持]的可能的重复(http://stackoverflow.com/questions/1353022/reflection-support-in-c) –

+2

MK辛格,我认为@Fredrik得到的是你可能想要去回过头来回答你的旧问题,并接受最能回答问题的答案(大绿剔号)。这是可能的,只有三分之一的问题得到了令人满意的回答,但您至少应该检查:-) – paxdiablo

回答

5

不,你说的是反射,一种访问环境内部细节的方式。 C目前没有内置到该语言中。

有办法来达到同样的效果,例如具有从字符串到整数指针映射数据结构,但它是一个有点混乱。作为一个例如:

int abc, def; 
char *strName[] = {"abc", "def"}; 
int *address[] = { &abc, &def}; 
: 
char *key = "def"; 
int newVal = 42; 

for (i = 0; i < sizeof (strName)/sizeof (*strName); i++) 
    if (strcmp (key, strName[i]) == 0) 
     *(address[i]) = newVal; 

这将经历键列表,直到它找到了一个匹配,则使用等效指针地址列表修改的变量。

但是,在所有诚实,一旦你有做一些黑暗和狡猾这样的,你可能也有一个更合适的数据结构,做到这一点。

例如,一个地图,其中的值存储在实际地图中,而不是保存“外部”整数地址。

+0

但我认为这是可能的在VB中..我是否正确? –

+4

@MKSingh它也可以在PHP中使用。所以呢? –

+0

其实我有一个字符串,它将列的名称存储在数据库中。我想创建一个像char * get(char [] param)的函数; 现在这个参数将读取表中不同列名的字符串。无论名称出现在param中,我的程序都应该从表中获取该列中的值。所有列都是表中的字符类型。 这怎么能实现 –

2

不仅你不能,而且它是C语言的意识形态的一部分。变量名在运行时不存在,变量内容在编译时不应该存在。

+0

我不同意'在编译时变量内容不应该重要。你可以有一个编译时常量变量来指定一个数组的大小,在编译过程中它确实很重要。 –

+0

没有双关的意思,但不是“常量变量”是一个字面的矛盾吗? :) –

+0

是的,但不是在编程上下文。 'const int x = 0'是一个常量变量... –

0

还有就是你通过查看源代码中看到你的程序有什么区别,并运行原始的二进制可执行文件,当你的“节目本身看见”。在可执行文件中,没有变量名称之类的东西。

比方说我们有这样的计划:

char str[4]="abc"; // note that you need to allocate 4 bytes 
int abc=123; 

以上是源代码,这是程序员所看到的。程序本身只是“看到”类似的东西:

在某些地址0x12345678,有4个字节。它们是0x61,0x62,0x63,0x00(ASCII码)。由于源代码中的字符类型,程序将以单个字节的形式访问它们。但是程序实际上并没有看到这种类型。

然后,在地址0x1234567C,4个字节在存储器进一步向下,我们有另一个4个字节(假定32位CPU)。它们包含值0x0000007B(123)。该程序仅将此int变量指向0x1234567C,它不知道程序员在源代码中将其称为abc。

0

您可以考虑代码生成。

随着XML:

<var type="int" name="abc" /> 

生成代码:

int abc; 

(输入XML本身可以自身与焦炭海峡创建[]作为输入)

相关问题