Hallo zusammen, was bedeutet folgender Code? #if _GNUC_ sei(); #else _SEI(); #endif
:
Verschoben durch User
Thomas H. schrieb: > Aber was ist GNUC? https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
Das ist ein Makro, das vom GNU-Compiler definiert wird. Die C-Compiler von Microsoft oder IBM haben das nicht definiert.
:
Bearbeitet durch User
Wenn ich weiß welchen Compiler ich habe, ist die #IF-Bedingung doch nicht nötig oder?
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?
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.
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
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.
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.
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 ....
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.
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
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?
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
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 :-)
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.
Johann L. schrieb: > Die einzige Diagnostic ist die angeforderte: Wow, danke. P.S.: Der Assemblercode gefällt mir. ^^
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.