我需要生成一个包含未实现功能的静态库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()
为简单起见,我们只举一个例子。c:
void user_imlplementation_of_func(void)
{
printf("OK");
}
我想知道是否可以拨打此电话?否则,是否有其他解决方案可以在静态库中使用未实现的函数,并让用户在将项目从源代码压缩到.lib文件后对其进行定义
答案 0 :(得分:2)
您需要在库的标题中将未实现的函数声明为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的评论所述,第三个解决方案是使用弱符号。 The wikipedia articel "Weak symbol"通过示例提供了很好的解释。
答案 1 :(得分:0)
您还可以做其他事情-函数指针:
//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"