我正在用C99编写一个库,并且该库的某些部分将从使用宏/内联函数中受益匪浅。内联函数更适合我的库。
但是,非常具体我不想在外部公开这些内联函数。
一切似乎都有效,但当我链接到库以创建可执行文件时,我得到错误:“未定义引用`na_impl_gfx__draw'”
我已将问题复制到一个最小化的测试用例中,这完全符合我的要求:
lib.h:
void somefunc();
lib.c:
#include <stdio.h>
#include "lib.h"
inline void someinline(char *value);
void somefunc() {
someinline("Hi!");
}
inline void someinline(char *value) {
printf("%s\n", value);
}
main.c中:
#include "lib.h"
int main(int argc, char *argv[]) {
somefunc();
}
现在我们编译:
doug@Wulf:~/test$ gcc -c -std=c99 lib.c
doug@Wulf:~/test$ gcc -c -std=c99 main.c
doug@Wulf:~/test$ gcc -std=c99 lib.o main.o
lib.o: In function `somefunc':
lib.c:(.text+0xe): undefined reference to `someinline'
lib.c:(.text+0x1a): undefined reference to `someinline'
lib.c:(.text+0x26): undefined reference to `someinline'
collect2: ld returned 1 exit status
在编译库时,内联函数似乎没有被替换为lib.h中函数somefunc()的目标代码。
为什么?
内联函数不在外部可见。我希望在编译库时,内联函数被内联到函数中,就像宏一样(Nb。仅使用宏代码编译文件)。
我做错了什么?或者这是内联函数的限制吗?
答案 0 :(得分:5)
您无法在同一源文件中看到内联函数的原因是您尚未将它们设置为静态。
您需要做的就是使用以下内容使原型静止:
inline static void someinline(char *value);
和函数定义static with:
inline static void someinline(char *value) {
printf("%s\n", value);
}
答案 1 :(得分:4)
[抱歉最近开始使用,你应该用C标记你的问题而不仅仅是C99。]
我认为你的问题完全是在错误的轨道上。内联函数只有在将它们放在“.h”文件中时才有意义。整个概念是关于使函数定义对所有调用者可见。
如果你这样做,你应该在标题中放置定义(带inline
),在一个编译单元中放置外部声明(带extern inline
)。
如果您只想在“lib.o”编译单元中安装函数,请忘记所有inline
或static
并让编译器为您执行此操作。如果您启用优化,gcc
会这样做:
`-finline小功能 当身体较小时,将功能集成到呼叫者中 比预期的函数调用代码(所以程序的整体大小得到 小)。编译器启发式地决定哪些功能 是 很简单,值得以这种方式整合。
Enabled at level `-O2'.