Существует как минимум три варианта использования s
для sin
:
Использовать макрос препроцессора:
#define s(x) (sin(x))
#define c(x) (cos(x))
float a = s(b)*c(c)+s(c+d)*c(d)....
#undef c
#undef s
Обратите внимание, что определения макросов немедленно удаляются с помощью #undef
, чтобы они не влияли на последующий код. Кроме того, вы должны знать об основах подстановки макросов препроцессора, отмечая тот факт, что первый c
в c(c)
будет расширен, а второй c
- нет, так как расширен только функциональный макрос c(x)
где за c
следует (
.
Это решение не повлияет на время выполнения.
Использовать встроенную функцию:
static inline double s(double x) { return sin(x); }
static inline double c(double x) { return cos(x); }
При хорошем компиляторе это не повлияет на время выполнения, так как компилятор должен заменить вызов s
или c
прямым вызовом sin
или cos
, что будет иметь тот же результат, что и оригинальный код. К сожалению, в этом случае функция c
будет конфликтовать с объектом c
, который вы показываете в своем примере кода. Вам нужно будет изменить одно из имен.
Использовать указатели функций:
static double (* const s)(double) = sin;
static double (* const c)(double) = cos;
При хорошем компиляторе это также не повлияет на время выполнения, хотя я подозреваю, что несколько других компиляторов могут не оптимизировать код с использованием этого решения, чем предыдущее решение. И снова у вас будет конфликт имен с c
. Обратите внимание, что использование указателей на функции создает прямой вызов функций sin
и cos
, минуя все макросы, которые для них могла бы определить реализация C. (Реализациям на C разрешено реализовывать библиотечные функции, используя как макросы, так и функции, и они могут делать это для поддержки оптимизаций или определенных функций. При хорошем качестве компилятора это обычно не представляет особой проблемы; оптимизация прямого вызова все же должна быть хорошей .)