这不是一个真正的问题,因为它已经解决了。但是我想在这里分享,因为有人可能遇到同样的问题。我希望对此有更深刻的解释。
我正在使用Keilμvision3在C8051F340上进行编程(我认为这与此问题无关)。在我的 main.c 中,我有类似的内容:
... // accessible code
getInput();
... // not accessible after modification
并在 mobile.c (忽略标题,包含,不相关的blablabla):
void getInput()
{
...
}
没关系。但是,在我对代码进行了一些修改后,
void getInput(struct SomeStruct *ss)
{
...
}
编译和下载到芯片完成没有任何错误。虽然我确实发现了警告:
***警告L2:未经解决的外部参考
符号:GETINPUT
但是我有点懒,而且我的同事还有很多其他的警告让人无法阅读。(坏习惯!)
我想学习的东西:
答案 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?)