用途:
当不想显性调用某一个函数时候,比如文件a.c里有个函数A,若想在main.c里面调用函数A,但是又不想通过函数名A去调用函数A。
解决办法:
1.在任意.h文件中
#define LIST_PRIORITY_MAX "0"
#define LIST_PRIORITY_MIN "20"
typedef int (*init_fn_t)(void);
#define USED __attribute__((used))
#define INIT_EXPORT(fn, level) USED const init_fn_t __list_init_##fn __attribute__((section("._list_." level))) = fn
#define INIT_MODE_EXPORT(fn, level) INIT_EXPORT(fn, level)
2.通过INIT_MODE_EXPORT将int (*)(void)类型的函数加入到列表中
3.在main.c(或其他.c)中
int mode_init_start(){
return 0;
}
int mode_init_end(){
return 0;
}
INIT_MODE_EXPORT(mode_init_start, LIST_PRIORITY_MAX);
INIT_MODE_EXPORT(mode_init_end, LIST_PRIORITY_MIN);
int module_list_init(){
volatile const init_fn_t *fn_ptr;
for (fn_ptr = &__list_init_mode_init_start; fn_ptr < &__list_init_mode_init_end; fn_ptr ++)
{
(*fn_ptr)();
}
return 0;
}
4.可以在main函数最前面调用module_list_init(),也可以选择其他合适位置