Я знаю, что есть как минимум три популярных метода для вызова одной и той же функции с несколькими именами. Я действительно не слышал, чтобы кто-то использовал четвертый метод для этой цели.
1). Можно использовать #defines:
int my_function (int);
#define my_func my_function
ИЛИ
#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;
Причина, по которой мне нужно несколько имен, - это математическая библиотека, которая имеет несколько реализаций того же метода.
Например, мне нужен эффективный метод вычисления квадратного корня из числа скалярных чисел с плавающей запятой. Поэтому я мог просто использовать math.h sqrt(). Это не очень эффективно. Поэтому я пишу один или два других метода, например, используя метод Ньютона. Проблема в том, что каждый метод лучше работает на некоторых процессорах (в моем случае - на микроконтроллерах). Поэтому я хочу, чтобы процесс компиляции выбирал лучший метод.
Я думаю, это означает, что было бы лучше использовать либо макросы, либо слабые псевдонимы, поскольку эти методы могут быть легко сгруппированы в несколько операторов #ifdef в файлах заголовков. Это упрощает обслуживание (относительно). Это также возможно сделать с помощью указателей функций, но он должен быть в исходном файле с объявлениями extern общих функций в файле заголовка.
Как вы думаете, лучший метод?
Edit:
Из предложенных решений, по-видимому, есть два важных вопроса, которые я не рассматривал.
Q. Являются ли пользователи работающими в основном на C/С++?
A.. Все известные разработки будут в C/С++ или сборке. Я разрабатываю эту библиотеку для личного использования, в основном для работы над голыми металлическими проектами. Не будет никаких или минимальных функций операционной системы. Существует дистанционная возможность использования этого в полномасштабных операционных системах, что потребует рассмотрения языковых привязок. Поскольку это для личного роста, было бы полезно изучить развитие библиотеки на популярных встроенных операционных системах.
Q. Пользователям будет нужна/нужна открытая библиотека?
A. Пока да. Поскольку это только я, я хочу сделать прямые изменения для каждого процессора, который я использую после тестирования. Здесь будет полезен набор тестов. Таким образом, открытая библиотека несколько помогла бы. Кроме того, каждая "оптимальная реализация" для конкретной функции может иметь неисправные условия. На этом этапе необходимо решить, кто исправляет проблему: пользователь или разработчик библиотеки. Пользователю понадобилась бы открытая библиотека для работы в условиях сбоя. Я и "пользователь", и "дизайнер библиотеки". Было бы лучше, если бы это было возможно. Затем приложения, отличные от реального времени, могут позволить библиотеке решить все проблемы стабильности по мере их появления, но приложения реального времени будут иметь возможность рассматривать алгоритм скорости/пространства и стабильности алгоритма.