Frage zu __attribute__ ((noinline))

Gast #1137480
Hallo,

ich möchte explizit inlining für bestimmte Funktionen verbieten, da
der erzeugte Code manchmal zu gross ist.

Dabei erzeugt folgende Konstruktion einen Compilerfehler
:expected ')' before '__attribute__'
:expected identifier or '(' before ')' token
1
static __attribute__((noinline))
2
void function( type param1 )
3
{
4
    ...
5
}


... und diese Konstruktion funktioniert !
1
#define noinline __attribute__((noinline))
2

3
static noinline
4
void function( type param1 )
5
{
6
    ...
7
}

Auch ist es egal, ob ich das _attribute_ vorne, mittig oder hinten bei 
der Function angebe.

Ich verstehe nicht warum das so ist und bitte um Hilfe dazu.

Compiler : avr-gcc (WinAVR 20081205) 4.3.2
Gast #1137530
Es funktioniert ja, aber eben nur in der #define Variante.

@Gast
Mit
1
__attribute__((__noinline__))
geht es. Kein Compilerfehler mehr, verstehe aber nicht warum ...


@Johann L.
Der Compiler meldet auch bei Trennung von Deklaration und Implementation
den Fehler. Die Optionen sollten bei explizitem noinline keine 
Auswirkung haben. Es geht ja auch um den Syntax-Compilerfehler ...


Meine eigentliche Frage ist aber, warum es mit der #define Variante 
geht, auch ohne _noinline_ ( mit zwei '_').
Persönliche Seite #1137576
xjn wrote:
> @Johann L.
> Der Compiler meldet auch bei Trennung von Deklaration und Implementation
> den Fehler. Die Optionen sollten bei explizitem noinline keine
> Auswirkung haben. Es geht ja auch um den Syntax-Compilerfehler ...

Intention dabei ist, nicht bei jeder Funktion hinterherlaufen zu müssen 
und zu schauen, ob gcc sie evtl. inlinet obwohl man das nicht will. In 
dem Falle spart man sich die zig-fache noinline-Attribuierung im 
Projekt, indem man dem Compiler sagt, daß er bitte Kleingerüffel nicht 
standardmässig inlinet.

> Meine eigentliche Frage ist aber, warum es mit der #define Variante
> geht, auch ohne _noinline_ ( mit zwei '_').

Evtl. weil du mit -ansi oder so übersetzt?
Moderator Persönliche Seite #1137587
xjn wrote:

> Meine eigentliche Frage ist aber, warum es mit der #define Variante
> geht, auch ohne _noinline_ ( mit zwei '_').

Weil du das #define auch bei der "ohne define"-Variante noch obendrüber
stehen hast. :-)  Was der Präprozessor dann draus macht ist:
1
static __attribute__((__attribute__((noinline))))
2
void foo(char c)
3
{
4
 x = c;
5
}
Gast #1137628
@Jörg Wunsch

Jaah, das ist es !

Wenn ich das #define 'xx' statt 'noinline' nenne, habe ich den gleichen 
Fehler :)

Ich nehme jetzt
1
__attribute__(__noinline__)
und alles ist Ok.

Danke an alle für die schnelle Hilfe ...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.