【问题标题】:Undefined variable and functions未定义的变量和函数
【发布时间】:2021-07-15 12:39:53
【问题描述】:

我想了解当 c 源代码文件具有未定义的变量和未定义的函数调用时,C 编译器和链接器如何处理?

例如,如果我的主要功能如下:

void main(void)
{
 myvar++;
 myfunc();
}

源文件中没有myvar的定义,源文件中也没有名为myfunc()的函数。

我的理解是编译器会对 myvar 的未知变量报错。链接器会给 myfunc() 报错。但是当编译器和链接器遇到这些行并抛出这些错误时,我对编译器和链接器的内部步骤(意味着工具链采取的逻辑步骤)没有清晰的理解。

假设我正在使用 GCC 编译器,ARM MCU 的链接器。

【问题讨论】:

  • inside steps 是什么意思?
  • @ssbssa 现在在上面的帖子中解释了它。我的主要动机是了解工具链所采取的步骤。例如,工具链何时执行内存管理步骤来为变量和函数分配内存?那么这些错误是发生在内存管理步骤之前还是之后呢?
  • 工具链在哪一步检查变量和函数调用的内部和外部链接......是在内存管理步骤之前还是之后?
  • that compiler will give error for unknown variable of myvar. And linker ... 编译器在出错的情况下不会生成object/exe文件,你怎么能有东西链接?或者您重用先前编译的结果来链接,因此您提供的源与您的问题不对应

标签: function variables gcc compiler-errors linker


【解决方案1】:

编译器并不执行实际的代码,而是从语法的角度来看它的正确性。当它在代码中遇到新变量时,它必须注册一个新变量的创建,是的,这意味着它存储了该变量的存在,而不是变量本身。因此,如果您的代码创建了一个 10 000 的数组,则编译器不必分配该内存量。相反,它将存储在创建具有给定类型的变量的引擎盖下的某个变量/结构中。因此,当编译器遇到引用变量的代码时,编译器可以检查具有该名称的变量是否已在它所引用的范围内创建/初始化,以及对变量执行的操作在语法上是否正确。因此,如果您创建了一个数组,那么将其除以 5 将没有任何意义,因此编译器将知道该操作无效。然而,如果你在数组中引用 10001 的元素,虽然它不存在,但这是一个运行时错误。

因此,从逻辑上讲,如果不先存储给定变量存在的事实,编译器就无法检查变量是否存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2023-03-08
    • 2013-09-27
    相关资源
    最近更新 更多