Вызывать функции извне статической библиотеки в C - PullRequest
0 голосов
/ 05 марта 2019

Мне нужно создать статическую библиотеку MyLib.lib, которая содержит нереализованные функции.

Внутри проекта я вызвал невыполненную функцию, как показано ниже:

/* Inside MyLib.c */

#include "MyLib.h"

void foo(void)
{
   func(); // To be implemented by the user.
}

И в заголовочный файл MyLib.h я включил заголовочный файл

#include "user.h" // contains user_imlplementation_of_func()

...


#define func()         user_imlplementation_of_func()

Чтобы упростить задачу, давайте просто приведем пример user.c:

void user_imlplementation_of_func(void)
{
   printf("OK");
}

Я хотел бы знать, возможно ли сделать этот вызов?Иначе, есть ли какое-либо другое решение использовать нереализованные функции внутри статической библиотеки и позволить пользователю определять их после сжатия проекта из исходного кода в файл .lib

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Вам необходимо объявить невыполненную функцию как extern в заголовке вашей библиотеки.Это говорит компилятору, что функция будет определена где-то еще.

Пример:

MyLib.h

void foo();

extern void func();

MyLib.c

#include "MyLib.h"

void foo(void)
{
    func();
}

main.c

#include <stdio.h>
#include "MyLib.h"

void func()
{
    printf("Hello, world!\n");
}

int main()
{
    foo();
}

Пример сборки:

cc -o MyLib.o -c MyLib.c
cc -o out main.c MyLib.o

Вывод:

$ ./out
Hello, world!

Однако для большей читабельности я предлагаю вам передавать функции вашего проекта в виде указателей на функции вашей библиотеки.Это обычно называется callback .

Пример:

/* MyLib.c */

#include "MyLib.h"

void foo(void (*func)(void))
{
   func();
}

Теперь вы можете вызывать функцию foo в вашем проекте с помощью:

foo(&user_imlplementation_of_func);

Редактировать:

Как указано в комментариях пользователя theSealion третье решение - использование слабых символов. Художественная статья Википедии "Слабый символ" дает хорошее объяснение с примерами.

0 голосов
/ 05 марта 2019

Вы можете сделать еще что-нибудь - указатель на функцию:

//youLib.c

extern void (*func)(void) = NULL;

extern void foo()
{
    if (func != NULL) {
        func();
    }
}
//main.c

static void user_imlplementation_of_func(void)
{
    printf("Hello\n");
}

func = &user_imlplementation_of_func;
foo(); //Will printf "Hello"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...