Für die Sicherheitsabfragen musst du in den Headerdateien nachschaun, ob es dort Preprocessor-ifdefs gibt, die dein Feature aktivieren. Direkt zu prüfen, ob eine Methode definiert ist geht mit dem Preprocessor nicht.
Für dein getline-Beispiel könnte man das so versuchen (die Signatur von getline befindet sich in /usr/include/stdio.h bzw. /usr/include/bits/stdio.h):
| #if defined(_STDIO_H) && (defined(__USE_XOPEN2K8) || (defined(__USE_EXTERN_INLINES) && defined(__USE_GNU)))
...getline vorhanden...
#else
...getline nicht vorhanden, alternative nutzen...
#endif
|
Wenn du beim Kompilieren nen Error haben willst, dann wird der Compilier schon einen werfen, wenn die Methode nicht existiert. Alternativ kannst du natürlich mit dem Preprocessor eine Error-Nachricht generieren, der Compiler hält dann da an:
| #if !defined(_STDIO_H) || (!defined(__USE_XOPEN2K8) && (!defined(__USE_EXTERN_INLINES) || !defined(__USE_GNU)))
#error "getline nicht vorhanden"
#endif
|
Habe jetzt jedoch nicht getestet, ob der spezielle Fall getline auch tatsächlich funktioniert. Bei so komplexen Abhängigkeiten bietet es sich an, das selber in ein eigenes Macro zu packen, nach dem man dann an anderer Stelle prüfen kann:
| #if defined(_STDIO_H) && (defined(__USE_XOPEN2K8) || (defined(__USE_EXTERN_INLINES) && defined(__USE_GNU)))
#define __HAVE_GETLINE__
#endif
...
#ifndef __HAVE_GETLINE__
... alternative nutzen ...
#endif
|
Für Sachen, die die glibc betreffen kannst du es dir jedoch einfacher machen:
| #include <features.h>
#if __GLIBC__ == 2 && __GLIBC_MINOR__ == 4
...glibc version 2.4
#endif
|
Du schaust einfach nach, ab welcher version ein feature eingeführt/verändert wurde und prüfst auf die glibc-version.
Viele Grüße
Martin