Forum: Compiler & IDEs Was bedeutet __GNUC__?


von Thomas H. (datatom)


Lesenswert?

Hallo zusammen,

was bedeutet folgender Code?

  #if _GNUC_
    sei();
  #else
    _SEI();
  #endif

: Verschoben durch User
von Peter II (Gast)


Lesenswert?


von Thomas H. (datatom)


Lesenswert?

Ok, danke.

Aber was ist _GNUC_?

von Peter II (Gast)


Lesenswert?


von Dirk B. (dirkb2)


Lesenswert?

Das ist ein Makro, das vom GNU-Compiler definiert wird.

Die C-Compiler von Microsoft oder IBM haben das nicht definiert.

: Bearbeitet durch User
von Thomas H. (datatom)


Lesenswert?

Wenn ich weiß welchen Compiler ich habe, ist die #IF-Bedingung doch 
nicht nötig oder?

von Peter II (Gast)


Lesenswert?

Thomas H. schrieb:
> Wenn ich weiß welchen Compiler ich habe, ist die #IF-Bedingung doch
> nicht nötig oder?

und was ist wenn der code mit mehre Compiler funktionieren soll?

von Thomas H. (datatom)


Lesenswert?

Aber wenn ich mich 100%ig auf einen Compiler beschränken will, z.B., 
wenn ich mit dem Atmel Studio 7 das Programm compiliere, ist die Abfrage 
auf den Compiler nicht nötig.

von Peter II (Gast)


Lesenswert?

Thomas H. schrieb:
> Aber wenn ich mich 100%ig auf einen Compiler beschränken will

Thomas H. schrieb:
> Aber wenn ich mich 100%ig auf einen Compiler beschränken will, z.B.,
> wenn ich mit dem Atmel Studio 7 das Programm compiliere, ist die Abfrage
> auf den Compiler nicht nötig.

ja

von Thomas H. (datatom)


Lesenswert?

Alles klar, vielen Dank.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Dirk B. schrieb:
> Das ist ein Makro, das vom GNU-Compiler definiert wird.
>
> Die C-Compiler von Microsoft oder IBM haben das nicht definiert.

m.W. setzt LLVM das Makro auch.

von Sheeva P. (sheevaplug)


Lesenswert?

Thomas H. schrieb:
> Aber wenn ich mich 100%ig auf einen Compiler beschränken will, z.B.,
> wenn ich mit dem Atmel Studio 7 das Programm compiliere, ist die Abfrage
> auf den Compiler nicht nötig.

Tja, und wenn Atmel Studio 8 einen anderen Compiler benutzt? Echt jetzt: 
an dieser Stelle ein paar Zeichen zu sparen, ist dumm, ignorant, oder 
beides.

von Hollender (Gast)


Lesenswert?

Sheeva P. schrieb:
> Echt jetzt:
> an dieser Stelle ein paar Zeichen zu sparen, ist dumm, ignorant, oder
> beides.

Oder man ist Anfänger. Aber das kann auch in einem der genanten
Attribute enthalten sein ....

von Nop (Gast)


Lesenswert?

Johann L. schrieb:
> Dirk B. schrieb:
>> Das ist ein Makro, das vom GNU-Compiler definiert wird.
>
> m.W. setzt LLVM das Makro auch.

Ja, weil es nicht den GCC anzeigt, sondern die Verfügbarkeit der 
GCC-Extensions.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nop schrieb:
> Johann L. schrieb:
>> Dirk B. schrieb:
>>> Das ist ein Makro, das vom GNU-Compiler definiert wird.
>>
>> m.W. setzt LLVM das Makro auch.
>
> Ja, weil es nicht den GCC anzeigt, sondern die Verfügbarkeit der
> GCC-Extensions.

Nö, weil GCC _GNUC_ auch dann setzt, wenn nicht GNU-C übersetzt wird 
sondern strict nach ISO, z.B. --std=c99 -pedantic

von Nop (Gast)


Lesenswert?

Johann L. schrieb:
> Nö, weil GCC GNUC auch dann setzt, wenn nicht GNU-C übersetzt wird
> sondern strict nach ISO, z.B. --std=c99 -pedantic

Womit fragt man dann die Verfügbarkeit von GCC-Erweiterungen ab?

von Rolf M. (rmagnus)


Lesenswert?

Nop schrieb:
> Johann L. schrieb:
>> Nö, weil GCC GNUC auch dann setzt, wenn nicht GNU-C übersetzt wird
>> sondern strict nach ISO, z.B. --std=c99 -pedantic
>
> Womit fragt man dann die Verfügbarkeit von GCC-Erweiterungen ab?

Wenn _STRICT_ANSI_ definiert ist, sind die Erweiterungen 
ausgeschaltet:
https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined-Macros

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Rolf M. schrieb:
> Nop schrieb:
>> Johann L. schrieb:
>>> Nö, weil GCC __GNUC__ auch dann setzt, wenn nicht GNU-C übersetzt wird
>>> sondern strict nach ISO, z.B. --std=c99 -pedantic
>>
>> Womit fragt man dann die Verfügbarkeit von GCC-Erweiterungen ab?
>
> Wenn __STRICT_ANSI__ definiert ist, sind die Erweiterungen
> ausgeschaltet:
> 
https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined-Macros

Auch das stimmt nicht.  Nochmal lesen :-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Beispiel:
1
avr-gcc foo.c -S -std=c89 -ansi -pedantic -W -Wall -Wextra
  
mit folgendem C-Programm:
1
#if defined __GNUC__ && defined __STRICT_ANSI__
2
__extension__
3
#warning GCC in Strict ANSI Mode.
4
5
__extension__ extern long long i;
6
7
__extension__ struct a { struct { int q; int w[0]; }; } a = { .q = 0 } ;
8
9
__inline__ __attribute__((__used__,__section__(".text.func")))
10
void func (void)
11
{
12
    register int a __asm__("30");
13
    __asm __volatile__ ("nop" : "=r" (a) :: "10");
14
    __builtin_avr_cli ();
15
}
16
#endif
 
Die einzige Diagnostic ist die angeforderte:
  
1
foo.c:3:2: warning: #warning GCC in Strict ANSI Mode. [-Wcpp]
2
 #warning GCC in Strict ANSI Mode.
3
  ^~~~~~~
 
Und zeug wie Inline-ASM und Section-Zuweisung werden nicht nur 
akzeptiert sondern auch wie erwartet compiliert.

von Nop (Gast)


Lesenswert?

Johann L. schrieb:

> Die einzige Diagnostic ist die angeforderte:

Wow, danke.

P.S.: Der Assemblercode gefällt mir. ^^

von MaWin (Gast)


Lesenswert?

Johann L. schrieb:
> Und zeug wie Inline-ASM und Section-Zuweisung werden nicht nur
> akzeptiert sondern auch wie erwartet compiliert.

Alles, was mit doppelten Underscores oder mit Underscore-Großbuchstabe 
beginnt gehört zur Implementation und ist auch ANSI-compliant.

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.