【问题标题】:Keil C51: Possible bug of functions with same name but different parameters?Keil C51:同名但参数不同的函数可能存在错误?
【发布时间】:2016-04-18 04:03:45
【问题描述】:

这不是一个真正的问题,因为它已经解决了。但我想在这里分享它,因为有人可能会遇到同样的问题。我很想对此有更深刻的解释。

我正在使用 Keil μvision3 在 C8051F340 上编程(我认为这与这个问题无关)。在我的 ma​​in.c 我有类似的东西:

... // accessible code
getInput();
... // not accessible after modification

mobile.c 中(忽略不相关的标题、包含、blablabla):

void getInput()
{
    ...
}

没关系。但是,在我对代码做了一些修改后,

void getInput(struct SomeStruct *ss)
{
    ...
}

编译和下载到芯片完成,没有任何错误。虽然我确实发现了一个警告:

*** 警告 L2:参考未解决的外部

符号:GETINPUT

但我有点懒惰,我的同事有很多其他警告,无法阅读。(坏习惯!)

我想学的东西:

  1. 为什么 Keil 允许这样的东西编译没有错误(在 C 中它 肯定是function not declared错误)?
  2. REFERENCE MADE TO UNRESOLVED EXTERNAL 说明了什么?它找到了具有相同名称的函数,但由于它具有不同的参数而无法解析,或者它只是允许任何函数而不检查它在项目中的存在?我找不到如何从中生成汇编代码,所以我不太确定。

【问题讨论】:

    标签: function keil c51


    【解决方案1】:

    在 C 语言中,如果您使用未在头文件中声明的函数,编译器将猜测定义(并取决于编译器标志)并发出警告。当编译器生成汇编代码时,它不再知道参数,只知道符号/符号指针,因此链接器无法检测到这一点(c++ 可以,因为那里的符号名称包含有关参数的信息,因为支持参数重载)。伪代码:

    push arg1
    call getInput   //the linker only sees this, does not know about stack-frame / arguments
    

    当谈到 GETINPUT 警告时,您似乎没有在最终结果中包含包含实际符号的已编译 C 文件(Keil 链接器似乎将符号大写,即使名称应该是 getInput,或者也许您也尝试调用 GETINPUT?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2020-12-23
      相关资源
      最近更新 更多