当前位置:  开发笔记 > 编程语言 > 正文

变量名如何存储在C中?

如何解决《变量名如何存储在C中?》经验,为你挑选了2个好方法。

我想问一下C变量是如何存储在C中的?

要更清楚地考虑以下代码:

int main() {
    int a = 1, b;
    b = a + 2;
    return 0;
}

例如,在这里,存储器C存储可变位置的名称.

例如,如果&a=0x12A7(假设)&b=0x123B1,那么c如何以及在何处存储变量名称,例如存储内存名称a



1> John Zwinck..:

变量名称根本不需要存储!编译器可以完全摆脱它们.想象一下,如果编译器非常聪明,它可以将整个程序减少到:

int main(){
  return 0;
}

请注意,此程序的效果与原始程序完全相同,现在根本没有变量!现在不需要给它们命名,是吗?

即使代码中的变量实际被使用,在编写程序时它们的名称纯粹是一种方便的表示法,但在执行代码时处理器不需要它们.就微处理器而言,这样的功能如下:

int foo(int x, int y) {
  int z = x + y;
  return z * 2;
}

在一些假设的简单指令集架构(ISA)中,可能导致编译代码执行此操作:

ADD # consumes top two values on stack (x and y), pushes result (z)
PUSH 2 # pushes 2 on stack
MULT # consumes top two values on stack (z and 2), pushes result
RET

较长的故事是有时存储变量名以用于调试目的.例如,如果您正在使用GCC,则可以传递-g选项以发出"符号表",其中包含用于调试的变量名称等内容.但是不需要简单地运行一个程序,并且它没有被语言标准所涵盖 - 它是一个实现功能,它因平台而异.



2> haccks..:

C不存储变量的名称.它是将编译器的符号表中的变量名称存储起来的编译器.
此数据结构由编译器创建和维护.
一个例子为片断一个符号表的

// Declare an external function
extern double bar(double x);

// Define a public function
double foo(int count)
{
    double  sum = 0.0;

    // Sum all the values bar(1) to bar(count)
    for (int i = 1;  i <= count;  i++)
        sum += bar((double) i);
    return sum;
}  

可能至少包含以下符号:

在此输入图像描述


符号表是编译时构造,它不反映运行时属性.映射文件和调试信息是可用于获取位置的符号名称的源,但它们并不意味着在程序中使用.RTTI和其他形式的内省是,但C没有任何形式的它
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有