Инициализировать глобальный массив указателей на функции во время компиляции или во время выполнения перед main ()
Я пытаюсь инициализировать глобальный массив указателей на функции во время компиляции, в C или C ++. Что-то вроде этого:
module.h
typedef int16_t (*myfunc_t)(void);
extern myfunc_array[];
module.cpp
#include "module.h"
int16_t myfunc_1();
int16_t myfunc_2();
...
int16_t myfunc_N();
// the ordering of functions is not that important
myfunc_array[] = { myfunc_1, myfunc_2, ... , myfunc_N };
func1.cpp, func2.cpp, ... funcN.cpp (символические ссылки на один файл func.cpp, так что создаются разные объектные файлы: func1.o, func2.o, func3.o, ..., funcN.o. NUMBER определяется с помощьюg++ -DNUMBER=N
)
#include "module.h"
#define CONCAT2(x, y) x ## y
#define CONCAT(x, y) CONCAT2(x, y)
int16_t CONCAT(myfunc_, NUMBER)() { ... }
При компиляции с использованием g ++ -DNUMBER = N, после предварительной обработки становится:
func1.cpp
...
int16_t myfunc_1() { ... }
func2.cpp
...
int16_t myfunc_2() { ... }
и так далее.
Декларацииmyfunc_N()
и инициализацияmyfunc_array[]
это не круто, так как N часто меняется и может быть от 10 до 200. Я предпочитаю не использовать скрипт или Makefile для их генерации. Порядок функций не так важен, я могу обойти это. Есть ли более аккуратный / умный способ сделать это?