【发布时间】:2016-11-23 13:52:24
【问题描述】:
我有一个希望内联的函数(我们称之为 void foo(void) {})。但我在 .cpp 文件中定义了它。
我无法将该函数移动到标题,因为它正在使用 .cpp 中的其他函数。
编辑:
下面的代码就像真正的代码一样没有使用 c++ 功能。我可以清楚地补充:
#ifdef __cplusplus
extern "C"
#endif
如果我想将下面的代码转换为 c99,我只需要更改我的项目属性(或 makefile,如果你愿意)不是代码。我也在询问 c++,因为它可以解决我的问题,而 c99 不能。
因此,我的问题中的 C 和 C++ 标记是合理的。代码是可移植的
见:When to use extern "C" in C++?
编辑 #2
好的,我知道我必须将 foo() 定义放在头文件中。如何在不将它们移动到头文件的情况下从foo() 调用func_a() 和func_b()?有什么解决办法吗?
示例
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);
//...
}
文件.h:
// Something before.
void foo (int a, double b); // function declaration
// Something after.
我想指出:
- 我正在使用 Visual Studio 2015。
- 我正在编写比较大的项目(~ 7000 行代码)。它是物理系统的模拟。
-
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
文件.h:
extern inline
void foo (int a, double b); // Declaration
但我不断收到警告:
warning : extern inline function "foo" was referenced but not defined
我不明白为什么会收到此警告。
有什么办法:
- 在我的 .cpp 文件中保留
foo()的定义?但仍使其内联 - 将
foo()移动到file.h,将func_a()和func_b()保留在file.cpp中,但使func_a()和func_b()符号对foo()“可见”(!并且仅对foo()!) 来自file.cpp - 还有其他解决方法吗?
抱歉,我仍在学习 cpp,我不知道我的问题是否清楚,或者是否可以从 .cpp 文件中内联函数。
【问题讨论】:
-
C is not C++ is not C. 不要添加无关标签!
-
@olaf 如您所见,我没有使用 c++ 功能。 extern "C" 是我在代码中经常使用的东西。
foo()很可能最终也会使用它。我说的是c++,因为c++可以解决这个问题而c不能 -
内联函数的定义必须存在于访问它的翻译单元中
-
顺便说一句,您可以将
func_afunc_b放入一些(可能是嵌套的)命名空间中,这样当前的命名空间就不会具有这两个功能。 -
[basic.def.odr] 说(第 4 段)“内联函数应在其奇数使用的每个翻译单元中定义。”您不能在一个翻译单元中使用它,而是在另一个翻译单元中定义它。