首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keil C51:可能是同名但参数不同的函数的错误?

Keil C51:可能是同名但参数不同的函数的错误?
EN

Stack Overflow用户
提问于 2016-01-13 09:01:59
回答 1查看 246关注 0票数 0

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

我正在使用Keilμvision3 3在μ上编程(我认为这与这个问题无关)。在我的main.c中,我有如下内容:

代码语言:javascript
复制
... // accessible code
getInput();
... // not accessible after modification

mobile.c(ignore头中,包含与之无关的blablabla ):

代码语言:javascript
复制
void getInput()
{
    ...
}

一切都很好。但是,在我对代码做了一些修改之后,

代码语言:javascript
复制
void getInput(struct SomeStruct *ss)
{
    ...
}

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

*警告L2:引用未解决的外部 符号: GETINPUT

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

我想学的是:

  1. 为什么Keil允许这样的东西在没有错误的情况下编译(在C中,它肯定是一个函数,而不是声明的错误)?
  2. 引用了未解决的外部说了什么?它找到了同名的函数,但是由于它有不同的参数而无法解析,或者它只是允许任何函数而不检查它在项目中的存在吗?我找不到如何从它生成汇编代码,所以我不完全确定。
EN

回答 1

Stack Overflow用户

发布于 2016-04-22 10:59:17

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

代码语言:javascript
复制
push arg1
call getInput   //the linker only sees this, does not know about stack-frame / arguments

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34762317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档