Как в препроцессоре Си проверить наличие функции

Мной пишется код, вставляемый далее в чужой проект, компилируемый неизвестным мне компилятором. Используется вроде бы стандартная библиотека math.h, однако на практике набор объявляемых в ней функций для разных компиляторов различен:

  • в GCC самый полный набор;
  • в MSC не хватает как минимум fmaxf и fminf, а также для использования мат.констант специально нужно объявить #define _USE_MATH_DEFINES;
  • в BC (Borland 6) нет всех функций с суффиксом "f" (принимающие и возвращающие float) и ряда других.

У меня код тестируется в составе проекта на BC, соответственно, чего не хватает в его math.h, но мной используется - я определяю отдельно. А вот как для неизвестного компилятора узнать, объявлена ли у него некая функция, или её в своём коде описать? Пока что мои объявления специфичны лишь для конкретных компиляторов и конкретных функций:

#ifdef __BORLANDC__
#include <math.h>
#include <math.hpp>
// При компиляции Борландом требуется доопределить функции
inline float atanh(float x) { return ArcTanh(x); }
inline float fmaxf(float x, float y) { return (x > y) ? x : y; }
inline float fminf(float x, float y) { return (x < y) ? x : y; }
inline float roundf(float x) { return floor(x); }

#define _BCEXPAND1F(fname) inline float fname##f(float x) { return fname(x); }
#define _BCEXPAND2F(fname) inline float fname##f(float x, float y) { return fname(x,y); }
_BCEXPAND1F(cos)
_BCEXPAND1F(sin)
_BCEXPAND1F(tan)
_BCEXPAND1F(acos)
_BCEXPAND1F(asin)
_BCEXPAND1F(atan)
_BCEXPAND2F(atan2)
_BCEXPAND1F(sqrt)
_BCEXPAND2F(pow)
_BCEXPAND1F(exp)
_BCEXPAND1F(fabs)
_BCEXPAND1F(log)
_BCEXPAND1F(log10)
#undef _BCEXPAND1F
#undef _BCEXPAND2F
#else                /* not(__BORLANDC__) */

#ifdef _MSC_VER
#define _USE_MATH_DEFINES
// При компиляции Микрософтом требуется доопределить функции
inline float fmaxf(float x, float y) { return (x > y) ? x : y; }
inline float fminf(float x, float y) { return (x < y) ? x : y; }
#endif                /* _MSC_VER */

#include <math.h>

#endif                /* __BORLANDC__ */


Ответы (0 шт):