B
Hallo Sepp3 und Mieser Schimmler,
das heißt dann ich definiere im Buildsystem die Macros, prüfe dann ob die gewünschten Funktionen enthalten sind und reagiere dann auf das Prüfergebnis. Das ist ja mit den Autotools recht einfach, z.B.
AC_CHECK_LIB([m],[round] ,[MATH_LIBS="-lm"],[AC_MSG_ERROR([round() in libm.a needed but not found])])
Ein
AC_FUNC_ROUND
gibt es nämlich nicht. (http://www.gnu.org/software/autoconf/manual/autoconf.html)
Der Quellcode muss dann aber bereits an einem bestimmten Standard angepast sein und für fehlende Funktionen selbst für Ersatz sorgen. Das Buildsystem muss dann dafür sorgen, das die Übersetzung des Quellcodes dem System entsprechend läuft oder die Übersetzung abbrechen.
Aber dann brauche ich die Macros nur um glibc Funktionen zugänglich zu machen wenn sie denn da wären.
Weil folgender Quellcode benutzt die altenative wenn ich die Macros nicht definiere. Zumindest bei mir.
gcc (GCC) 4.2.4 (Debian 4.2.4-6)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double iff_round(double value) {
double integer_value = 0.0;
#if _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L
integer_value = round(value);
#else
double fractional_value = 0.0;
fractional_value = modf (value, &integer_value);
if (integer_value < 0.0) {
if (fractional_value < -0.5) {
integer_value = integer_value - 1.0;
}
else {
/* Do nothing
*/
}
}
else {
if (fractional_value >= 0.5) {
integer_value = integer_value + 1;
}
else {
/* Do nothing
*/
}
}
#endif
return integer_value;
}
int main(int argc, char *argv[])
{
double number_one = 13.198553490;
double number_two = 13.998553490;
#if !( defined _XOPEN_SOURCE )
printf("_XOPEN_SOURCE ist nicht definiert\n");
#endif
#if !( defined _ISOC99_SOURCE )
printf("_ISOC99_SOURCE ist nicht definiert\n");
#endif
#if !( defined _POSIX_C_SOURCE )
printf("_POSIX_C_SOURCE ist nicht definiert\n");
#endif
printf("Number=%f gerundet=%f\n", number_one, iff_round(number_one));
printf("Number=%f gerundet=%f\n", number_two, iff_round(number_two));
return EXIT_SUCCESS;
}
Gruß,
BlackPepper