我如何使用但不在c99库中公开内联函数?

Dou*_*oug 3 c gcc inline c99

我正在用C99编写一个库,并且库的某些部分可以从使用宏/内联函数中获益.内联函数更适合我的库.

但是,非常具体地说我不想在外部公开这些内联函数.

一切似乎都有效,但当我链接到库以创建可执行文件时,我得到错误:"未定义引用`na_impl_gfx__draw'"

我已经将问题复制到一个最小的测试用例,它完全符合我的要求:

lib.h:

void somefunc();
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

main.c中:

#include "lib.h"
int main(int argc, char *argv[]) {
  somefunc();
}
Run Code Online (Sandbox Code Playgroud)

现在我们编译:

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
Run Code Online (Sandbox Code Playgroud)

看来,在编译库时,内联函数没有被替换为lib.h中函数somefunc()的目标代码.

为什么?

内联函数不是外部可见的.我希望在编译库时,内联函数被内联到函数中,就像宏一样(Nb.仅使用宏代码编译文件).

我究竟做错了什么?或者这是内联函数的限制?

Law*_*man 5

您无法在同一源文件中看到内联函数的原因是您尚未将它们设置为静态.

您需要做的就是使原型静态:

inline static void someinline(char *value);
Run Code Online (Sandbox Code Playgroud)

和函数定义static:

inline static void someinline(char *value) {
  printf("%s\n", value);
}
Run Code Online (Sandbox Code Playgroud)