Hallo Siro,

Code:
#if defined _GNU_SOURCE && defined __GNUC__
_GNU_SOURCE dürfte in einem Header definiert sein, wenn man bestimmte Projekte übersetzt.
__GNUC__ ist definiert wenn du mit dem GNU-Compiler übersetzt.
Der folgende Code wird nur verwendet wenn diese beiden Bedingungen erfüllt sind

#define strdupa(__s) \
    (__extension__ ({const char *__in = (__s); \
             size_t __len = strlen (__in) + 1; \
             char * __out = (char *) __builtin_alloca (__len); \
             (char *) memcpy (__out, __in, __len);}))
#define strndupa(__s, __n) \
    (__extension__ ({const char *__in = (__s); \
             size_t __len = strnlen (__in, (__n)) + 1; \
             char *__out = (char *) __builtin_alloca (__len); \
             __out[__len-1] = '\0'; \
             (char *) memcpy (__out, __in, __len-1);}))
#endif /* _GNU_SOURCE && __GNUC__ */
strdupa(); und strndupa(); werden als inline Code definiert, verwenden aber compilerinterne Mechanismen (__builtin_alloca (); )

Zitat Zitat von Siro Beitrag anzeigen
Das Problem ist, wie Ihr schon sagt, die Vielfältigkeit und das macht es einem Bitschieber nicht grade einfach noch durchzublicken.
und 4 Unterstriche gibt es dann auch schon mal: Auszug stdarg.h vom GCC ]
Code:
#if !defined (_VA_LIST_) || defined (__BSD_NET2__) || defined (____386BSD____) || defined (__bsdi__) || defined (__sequent__) || defined (__FreeBSD__) || defined(WINNT)
/* The macro _VA_LIST_DEFINED is used in Windows NT 3.5  */
Ist ein Hinweis, dass bei obigen Bedingungen (Es wird z.B. für Windows NT 3.5 übersetzt, ein anderes Macro verwendet wird.

Gerade der GNU-Compiler ist für unzählige CPUs, Betriebssysteme und Versionen vorhanden. Und jede Variante hat halt ihre speziellen Eigenheiten.
Wenn man es beherrscht, kann man in C Code schreiben, welcher unter unterschiedlichen Betriebssystem und CPUs funktioniert, das spart dann eine Menge Arbeit bei 
der Pflege. Ich selbst habe z.B. Übertragungsprotokolle geschrieben, welche auf eine Micro-Controller (meist ein Hitachi H8) und unter Windows laufen. Dabei ist dann der
Sourcecode nur einmal auf der Festplatte abgelegt und wird in beiden Projekten eingebunden. Hat den Vorteil, dass beide Projekte immer automatisch auf dem selben
Stand sind, wenn man etwas ändert. 
Bei mir waren dann oft noch zwei unterschiedliche Compiler im Spiel, VC für Windows und IAR für den H8. Da muss man dann vieles selber machen, was einem der GNU schon abnimmt, z.B. haben die #pragma unterschiedliche Syntax bei den beiden Compilern.
MfG Peter(TOO)