Я получил кучу функций C, которые получают назначенные на массив указателей на функции, вдоль линий этого:определения массива функций C
typedef int (*func)(int);
int SomeLongName1(int a) {
// ...
}
// ...
int SomeLongName1000(int a) {
// ...
}
func f[] = { SomeLongName1, ... , SomeLongName1000 };
Это много работы по созданию и подвержен ошибкам. Например, в имени функции может быть опечатка, так что действительная функция все еще называется, но неправильная. Или, если в конце добавлена новая функция, можно забыть войти и явно добавить ее в список указателей функций.
Чтобы избежать явного объявления массива указателей функций, я пробовал различные трюки, такие как макросы, которые затрудняют понимание кода и требуют знать, как работает макрос, и я вообще не удовлетворен ими.
То, что я хотел бы сделать что-то вроде этого:
typedef int (*func)(int);
func f[] = {
int SomeLongName1(int a) {
// ...
}
// ...
int SomeLongName1000(int a) {
// ...
}
};
Таким образом, массив будет создан автоматически, и если есть какой-то способ поставить пустой указатель в конце, так что я могу определить, сколько указателей функций есть, это было бы здорово.
Однако вышеприведенное недействительно C, и я прихожу пустым с любым способом этого. Если это нечто специфическое для компилятора (например, расширение GCC), это будет нормально.
Все функции статически известны во время компиляции, поэтому я хотел бы избежать необходимости выполнять инициализацию во время выполнения массива указателей функций - не то, что я нашел способ сделать это таким образом.
Этот связанный вопрос How to define an array of functions, кажется, задает тот же вопрос, но не доводит его до его логического завершения. В частности, я не хочу переписывать все, что я уже набрал, чтобы сэкономить время и избежать ошибок.
Мне очень нравится эта идея. Какой-то учебник о том, как использовать m4 в контексте программы на C, будет приятным (пока не удастся с Google ...) – Michael
Я добавил определения 'm4', которые должны сделать трюк. Однако я его не тестировал, поэтому в нем может быть ошибка. Идея состоит в том, что макрос 'functionList' накапливает список имен функций, чтобы впоследствии выгрузить их в литерал массива. – cmaster
Спасибо, это очень полезно. Каков рекомендуемый способ запуска C-источника через m4? Я надеюсь, что смогу сделать это аналогично существующему препроцессору, то есть без необходимости сохранять промежуточный вывод m4 для компиляции. – Michael