Если вы используете GCC, вы можете сделать свою функцию weak
. Эти могут быть переопределены с помощью слабых функций:
test.c:
#include
__attribute__((weak)) void test(void) {
printf("not overridden!\n");
}
int main() {
test();
}
Что он делает?
$ gcc test.c
$ ./a.out
not overridden!
test1.c:
#include
void test(void) {
printf("overridden!\n");
}
Что он делает?
$ gcc test1.c test.c
$ ./a.out
overridden!
К сожалению, это не сработает для других компиляторов. Но вы можете иметь слабые объявления, которые содержат переопределяемые функции в собственном файле, помещая только включение в файлы реализации API, если вы компилируете с использованием GCC:
weakdecls.h:
__attribute__((weak)) void test(void);
... other weak function declarations ...
functions.c:
/* for GCC, these will become weak definitions */
#ifdef __GNUC__
#include "weakdecls.h"
#endif
void test(void) {
...
}
... other functions ...
Недостатком этого является то, что он не работает полностью , не делая ничего с файлами api (для этих трех строк и слабых делений) , Но как только вы сделали это изменение, функции можно легко переопределить, записав глобальное определение в один файл и связав это.