Как использовать, но не предоставлять встроенную функцию в библиотеке C99? - PullRequest
3 голосов
/ 06 марта 2011

Я пишу библиотеку на 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

Может показаться, что при компиляции библиотеки встроенная функция не подставляется в объектный код для функции somefunc () в lib.h

Почему?

Встроенная функция не видна снаружи. Я ожидаю, что когда библиотека скомпилирована, встроенная функция встроена в функцию, точно так же, как макрос (Примечание: используя только макрос, этот код компилирует файл).

Что я делаю не так? Или это ограничение встроенных функций?

Ответы [ 2 ]

5 голосов
/ 06 марта 2011

Причина, по которой вы не видите встроенную функцию в одном и том же исходном файле, заключается в том, что вы не сделали их статичными.

Все, что вам нужно сделать, это сделать прототип статичным с помощью:

inline static void someinline(char *value);

и статическое определение функции:

inline static void someinline(char *value) {
  printf("%s\n", value);
}
4 голосов
/ 19 марта 2011

[Извините за то, что добавили в последнее время, вы должны были пометить свой вопрос с C, а не только C99.]

Я думаю, что с вашим вопросом вы совершенно не на том пути.Встроенные функции имеют смысл только тогда, когда вы помещаете их в файл «.h».Вся концепция заключается в том, чтобы сделать определение функции видимым для всех вызывающих абонентов.

Если вы сделаете это, вам просто нужно поместить определение (с inline) в заголовок и внешнее объявление (с * 1006).*) в одном модуле компиляции.

Если вы просто хотите разместить функции в своем модуле компиляции "lib.o", забудьте обо всем этом inline или static и дайте компилятору это сделатьдля тебя.gcc делает это, если вы включаете оптимизацию:

`-finline-small-functions 'Интегрируйте функции в вызывающие объекты, когда их тело меньше ожидаемого кода вызова функции (поэтому общий размер программы получаетсяменьше).Компилятор эвристически решает, какие функции достаточно просты, чтобы их можно было интегрировать таким образом.

 Enabled at level `-O2'.
...