Keil C51:具有相同名称但参数不同的函数可能存在错误?

时间:2016-01-13 09:02:00

标签: function keil c51

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

我正在使用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. 对无法解决的外部参考说什么?它找到了具有相同名称的函数但由于它具有不同的参数而无法解析,或者它只是允许任何函数而不检查它在项目中的存在?我找不到如何从中生成汇编代码,所以我不太确定。

1 个答案:

答案 0 :(得分:0)

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

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

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