[英]extern inline function was referenced but not defined
我有一个函数(让我们称之为void foo(void) {}
)我想要内联。但我在.cpp文件中定义它。
我无法将函数移动到标题,因为它正在使用.cpp中的其他函数。
编辑:
下面的代码就像真正的代码一样,不使用c ++功能。 我可以清楚地补充:
#ifdef __cplusplus
extern "C"
#endif
如果我想将下面的代码转换为c99,我只需要更改我的项目属性(如果你愿意,还可以更改makefile),而不是代码 。 我也问c ++因为meaby它可以解决我的问题,而c99不能。
因此我的问题中的C和C ++标签是合理的。 代码是可移植的
看: 何时在C ++中使用extern“C”?
编辑#2
好吧,我明白我必须把foo()
定义放在头文件中。 如何从foo()
调用func_a()
和func_b()
foo()
而不将它们移动到头文件? 有没有解决方法?
例
file.c / .cpp:
int func_a (int a, int b, int c) {/*...*/};
double func_b (double a, double b, double c) {/*...*/};
void foo (int a, double b) { // unction definition
//...
int myInt = func_a(a, 2, 3);
//...
double myDouble = func_b(1.5f, b, 3.5f);
//...
}
file.h:
// Something before.
void foo (int a, double b); // function declaration
// Something after.
我想指出:
file.h
包含在许多其他编译单元中。 foo(int, double)
很小,它从file.cpp
调用其他函数 foo(int, double)
内联(我最终会使用__forceinline__
) foo()
。 它也在几个while循环中使用(每个100k +迭代),因此让这个符号foo()
不是内联的是扩展的。
我试过了:
file.c / .cpp:
extern inline
void foo (int a, double b) {\*...*\}; // Definition
file.h:
extern inline
void foo (int a, double b); // Declaration
但我一直在警告:
warning : extern inline function "foo" was referenced but not defined
我不明白为什么我会收到这个警告。
有没有办法:
foo()
定义? 但仍然使它内联 foo()
移到file.h
,将func_a()
和func_b()
在file.cpp
,但使func_a()
和func_b()
符号对foo()
“可见”(!并且只对foo()
!)来自file.cpp
Sory我还在学习cpp而且我不知道我的问题是否清楚,或者甚至可以从.cpp文件中生成内联函数。
在C ++中, inline
关键字意味着:
就是这样。 实际上,这意味着它启用并强制您将函数体放入头文件中。
关键字本身与函数内联无关。 只是如果编译器希望能够内联函数的主体,它在编译调用代码时必须能够访问它; 换句话说,函数的主体必须位于同一源文件或该源文件包含的头文件中。
如果要使编译器内联所有调用站点中的函数,并且这些调用站点发生在多个源文件中,则必须将该函数放入头文件(并将其标记为inline
)。
另一方面, 链接器也可以进行内联,称为链接时代码生成或整个程序优化或类似的东西(取决于您的工具链的供应商)。 启用此功能
所以为了内联函数,你有两个选择。 将函数放入头文件,或启用并依赖链接时优化来为您内联。
在您的特定情况下,要使用__forceinline__
,您将在头文件中定义foo
。 这需要foo
的定义来查看func_a
和func_b
声明。 要防止名称空间污染,您可以在foo
的范围内声明这些函数:
inline void foo(int a, double b) { // function definition
int func_a(int, int, int);
double func_b(double, double, double);
//...
int myInt = func_a(a, 2, 3);
//...
double myDouble = func_b(1.5f, b, 3.5f);
//...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.