我得到了一些编译器/连接错误,我不知道什么是进行正确的方法。 我在这样的情况:
- 啊:在此文件中被定义声明为“在线”的功能,例如:内嵌无效foo1();
- BH:在此文件中被定义声明为调用foo1()“内联”的函数:内嵌无效foo2的();
- main.c中:有一些功能都foo1和foo2的()的调用。
现在,如果我宣布foo1和foo2的在啊和bh为extern内嵌无效我得到了以下错误:
PRJ / SRC / BO:在功能foo1': (.text+0x0): multiple definition of
foo1'。PRJ / SRC / main.o :(文本+为0x0):此处首先定义使:* [内核]错误1
什么是允许编译和链接没有错误/我中所描述的情况警告的方式吗?
从http://gcc.gnu.org/onlinedocs/gcc/Inline.html :
当inline函数不是静态的,那么编译器必须假定有可能是从其他源文件调用; 因为全局符号只能一次在所有程序中定义,该函数必须不能在其他源文件中定义的,所以调用不能被集成。 因此,非静态的内联函数总是以通常的方式编译自身。
换句话说,无static
,它会发出你的内联函数的符号。 如果碰巧在定义的报头的功能和它包括在一个以上的编译单元,则结束了多个(重新定义)符号。 如果您想在标题中的定义,你应该让static
。
我试了一下,并没有得到任何错误
啊
extern inline void foo1()
{
return;
}
BH
extern inline void foo2()
{
foo1();
return;
}
main.cpp中
#include "a.h"
#include "b.h"
int main() {
foo1();
foo2();
return 0;
}
把inline
定义,你.h
文件和.c
文件,强制外部定义。
例如:
// File: a.h
inline void foo1(void) { /*...*/ }
// File main.c
#include "a.h"
extern inline void foo1(void);
int main(void)
{
/*...*/
}