问题描述:今天在移植mcal中的部分代码时,然后进行编译,在链接的步骤里面,遇见了报错"undefined reference to xxx",未定义的函数被引用的问题,实际上那个函数是被定义了的,不过那个函数比较特殊,是一个被extern inline修饰的定义在头文件中的函数,是extern inline 函数。这种函数可以有两个定义的地方,一个是头文件中,另一个是c文件中,不过是这两个函数的内容必须一模一样,如果其他地方引用这个函数时,是以函数指针的形式进行引用,那么就需要在c文件中也有一个一模一样的定义,c文件中对这个函数的定义就是没有前面的extern inline进行修饰;如果这个函数都是进行普通的函数调用,那么不需要在另外的c文件中进行定义,只需要在头文件中有定义即可。
// lib.c
void libfunc()
{
/* ... */
}
// lib.h
extern inline libfunc()
{
/* ... */
}
这里回顾一下c语言的extern和inline相关知识
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。
inline关键字是C99标准的关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。
解决方法:设置编译器的优化选项,最开始是none无优化,设置为balanced后,可以成功编译通过。猜测是,编译器默认将inline进行了disable,由于函数名前面有打开优化选项后,编译器将inline进行了enable。
本文参考内容:C 语言中的冷门知识点:extern inline 函数 - 知乎,extern在c语言中是什么意思?_百度知道,c语言inline有什么作用,C语言inline关键字_kyosanto的博客-CSDN博客