gpt4 book ai didi

c - 编译器如何区分名称相同的项目

转载 作者:行者123 更新时间:2023-12-05 08:48:16 24 4
gpt4 key购买 nike

在下面的例子中:

int main(void) {
int a=7;
{
int a=8;
}
}

如果没有优化,生成的程序集将是这样的(来自 Compiler Explorer):

main:
pushq %rbp
movq %rsp, %rbp
movl $7, -4(%rbp) // outer scope: int a=7
movl $8, -8(%rbp) // inner scope: int a=8
movl $0, %eax
popq %rbp
ret

如果存在重复命名的变量,编译器如何知道变量在哪里?也就是说,在内部范围内时,内存地址位于 %rbp-8,而在外部范围内时,地址位于 %rbp-4

最佳答案

有很多方法可以实现本地作用域规则。这是一个简单的例子:

  • 编译器可以保留一个嵌套作用域列表,每个作用域都有自己的符号定义列表。
  • 这个列表最初有一个全局范围的元素,
  • 当它解析函数定义时,它会在函数参数名称的范围列表前面添加一个新的范围元素,并在该范围元素的标识符列表中添加每个参数名称和相应的信息。
  • 对于每个新 block ,它都会在范围列表前面添加一个新的范围元素。 for ( 在其第一个子句中也为定义引入了一个新的范围。
  • 在离开作用域时(在 block 的末尾),它从作用域列表中弹出作用域元素。
  • 当它解析声明或定义时,如果相应的符号已经在当前范围的列表中,则它是局部重定义,这是被禁止的(extern 前向声明除外)。否则,符号被添加到范围列表中。
  • 当它在表达式中遇到一个符号时,它会在当前作用域的符号列表中查找它,并在作用域列表中的每个后续作用域中查找它,直到找到它为止。如果找不到该符号,则它是未定义的,根据最新的 C 标准,这是一个错误。否则符号信息用于进一步解析和代码生成。

上述步骤是针对类型和对象名称执行的,为 structunionenum 标签维护了一个单独的符号列表。

在所有这些发生之前,在程序翻译的单独阶段执行预处理。

关于c - 编译器如何区分名称相同的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66166153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com