Я знаю, что есть как минимум три популярных метода для вызова одной и той же функции с несколькими именами. На самом деле я не слышал, чтобы кто-то использовал для этой цели четвертый метод.
1). Можно использовать #defines:
int my_function (int);
#define my_func my_function
OR
#define my_func(int (a)) my_function(int (a))
2). Вызовы встроенных функций - еще одна возможность:
int my_func(int a) {
return my_function(a);
}
3). Используйте слабый псевдоним в компоновщике:
int my_func(int a) __attribute__((weak, alias("my_function")));
4). Функциональные указатели:
int (* const my_func)(int) = my_function;
Причина, по которой мне нужно несколько имен, заключается в том, что математическая библиотека имеет несколько реализаций одного и того же метода.
Например, мне нужен эффективный метод для вычисления квадратного корня скалярного числа с плавающей запятой. Так что я мог бы просто использовать sqrt () из math.h. Это не очень эффективно. Поэтому я пишу один или два других метода, например, один, использующий метод Ньютона. Проблема в том, что каждая техника лучше на определенных процессорах (в моем случае микроконтроллеры). Поэтому я хочу, чтобы в процессе компиляции был выбран лучший метод.
Я думаю, это означает, что было бы лучше использовать либо макросы, либо слабый псевдоним, поскольку эти методы можно легко сгруппировать в несколько операторов #ifdef в заголовочных файлах. Это упрощает обслуживание (относительно). Можно также использовать указатели на функции, но это должно быть в исходном файле с внешними объявлениями общих функций в заголовочном файле.
Как вы думаете, какой метод лучше?
Edit:
Из предложенных решений, как представляется, есть два важных вопроса, которые я не рассмотрел.
Q. Работают ли пользователи преимущественно на C / C ++?
A. Все известные разработки будут на C / C ++ или сборке. Я проектирую эту библиотеку для личного пользования, в основном для работы над голыми металлическими проектами. Там будет либо нет, либо минимальные функции операционной системы. Существует удаленная возможность использования этого в полнофункциональных операционных системах, что потребует рассмотрения языковых привязок. Поскольку это для личного роста, было бы полезно изучить разработку библиотек на популярных встроенных операционных системах.
Q. Будут ли пользователи нуждаться в / хотят иметь открытую библиотеку?
A. Пока что да. Так как это только я, я хочу сделать прямые модификации для каждого процессора, который я использую после тестирования. Вот где набор тестов будет полезен. Таким образом, открытая библиотека может несколько помочь. Кроме того, каждая «оптимальная реализация» для конкретной функции может иметь условия сбоя. На этом этапе необходимо решить, кто решает проблему: пользователь или разработчик библиотеки. Пользователю понадобится открытая библиотека, чтобы обойти сбойные условия. Я и пользователь, и дизайнер библиотеки. Было бы почти лучше учесть и то и другое. Тогда приложения не в реальном времени могут позволить библиотеке решать все проблемы стабильности по мере их появления, но приложения реального времени будут иметь возможность учитывать скорость / пространство алгоритма и стабильность алгоритма.