Forum: Compiler & IDEs gcc4 / neue avrlibc


von Ssss S. (sssssss)


Lesenswert?

Hi!

Ich suche eine möglichkeit einfach per preprozessor #if #else
den gcc4 zu erkennen.
Welche Variable kann ich da abfragen ? Gibts was wie GCC_VERSION ?

Problem ist nämlich das bei der gcc4 bzw neuen avrlibc die
delay.h von avr/delay.h nach util/delay.h gewandert ist.
Ausserdem noch anderer kleinkram ...

Ich suche also sowas wie:
1
#if GCC4
2
 #include <avr/delay.h>
3
#else
4
 #include <util/delay.h>
5
#endif

Geht bestimmt, habs nur bis jetzt nicht per google & co rausfinden
können ::)

Gruss,
Simon

von Ssss S. (sssssss)


Lesenswert?

habs doch noch gefunden ...
gibt jetzt ne <avr/version.h>:
1
#ifndef _AVR_VERSION_H_
2
#define _AVR_VERSION_H_
3
4
/** \ingroup avr_version
5
    String literal representation of the current library version. */
6
#define __AVR_LIBC_VERSION_STRING__ "1.4.4"
7
8
/** \ingroup avr_version
9
    Numerical representation of the current library version.
10
11
    In the numerical representation, the major number is multiplied by
12
    10000, the minor number by 100, and all three parts are then
13
    added.  It is intented to provide a monotonically increasing
14
    numerical value that can easily be used in numerical checks.
15
 */
16
#define __AVR_LIBC_VERSION__        10404UL
17
18
/** \ingroup avr_version
19
    String literal representation of the release date. */
20
#define __AVR_LIBC_DATE_STRING__    "20060420"
21
22
/** \ingroup avr_version
23
    Numerical representation of the release date. */
24
#define __AVR_LIBC_DATE_            20060420UL
25
26
/** \ingroup avr_version
27
    Library major version number. */
28
#define __AVR_LIBC_MAJOR__          1
29
30
/** \ingroup avr_version
31
    Library minor version number. */
32
#define __AVR_LIBC_MINOR__          4
33
34
/** \ingroup avr_version
35
    Library revision number. */
36
#define __AVR_LIBC_REVISION__       4

Das gibt wieder nen netten #ifdef #endif haufen :-X

Bye, Simon

von peter dannegger (Gast)


Lesenswert?

Ich schenke mir den ganzen Unter-Include-Schrunz und kopiere bei jeder
neuen WINAVR-Version alles zusammen ins Include.


Peter

von Rolf Magnus (Gast)


Lesenswert?

Das ist natürlich auch eine prima Möglichkeit, ein schönes Durcheinander
zu produzieren und ggf. seltsame Bugs zu ernten.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Damit du den #if/#else-Haufen nicht brauchst, gibt's doch
extra _AVR_LIBC_VERSION_.  Deren Wert wächst monoton mit
den Versionen, du kannst ihn also mit einem einfachen >
vergleichen.

Außerdem haben wir <avr/version.h> noch von <avr/io.h> mit
includiert, damit es in einem Headerfile auftaucht, was es
garantiert schon früher gab und was sowieso praktisch jeder
bereits benutzt.  Für eine avr-libc-Version < 1.4.x kannst
du also mit

#if _AVR_LIBC_VERSION_ < 10400UL

testen.  (Unbekannte Makros ersetzt der Präprozessor in
mathematischen Ausdrücken durch den Wert 0.  Das ist vom
Standard abgedeckt.)

GCC belegt den Makro _GNUC_ mit seiner major version, also
#if _GNUC_ >= 4 gilt für alles ab GCC 4.x.  Außerdem gibt's
noch _GNUC_MINOR_.

Du solltest natürlich einen sinnvollen Test vornehmen, also
_AVR_LIBC_VERSION_ wenn es um Features der avr-libc geht,
_GNUC_, wenn es um den Compiler selbst geht.

von Ssss S. (sssssss)


Lesenswert?

>Außerdem haben wir <avr/version.h> noch von <avr/io.h> mit
>includiert, damit es in einem Headerfile auftaucht, was es
>garantiert schon früher gab und was sowieso praktisch jeder
>bereits benutzt.  Für eine avr-libc-Version < 1.4.x kannst
>du also mit
Ah super! danke für die Info ;)
Schade dass ich relativ lange gebraucht habe um die mitteilung über die
neue version.h zu finden.
Es wäre evtl hilfreich auf der avr libc seite direkt mit einem
auffälligen
Text darauf hinzuweisen bzw eine faq dazu ;)

>#if _AVR_LIBC_VERSION_ < 10400UL
jepp, genau das benutze ich ;)

gcc4 war quatsch, es ist ja die neue libc :)

Bye, Simon

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.