0

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

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

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

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

void getInput()
{
    ...
}

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

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

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

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

符号:GETINPUT

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

我想学的东西:

  1. 为什么 Keil 允许这样的东西编译没有错误(在 C 中它绝对应该是一个未声明错误的函数)?
  2. 对未解决的外部的参考是什么意思?它找到了具有相同名称的函数,但由于它具有不同的参数而无法解析,或者它只是允许任何函数而不检查它在项目中的存在?我找不到如何从中生成汇编代码,所以我不太确定。
4

1 回答 1

0

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

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

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

于 2016-04-22T10:59:17.470 回答