Forum: Compiler & IDEs Frage zu __attribute__ ((noinline))


von xjn (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Hallo,

versuche es mal mit __attribute__((_noinline_))

MfG

von Gast (Gast)


Lesenswert?

Nachtrag:
((noinline)) vorne und hinten mit 2 unterstrichen. Die Forumssoftware 
scheint hier anderer Meinung zu sein.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ich trenn immer zwischen Deklaration und Implementierng:
1
static void __attribute__((noinline)) foo (void);
2
3
...
4
5
void foo (void)
6
{
7
    ...
8
}

Evtl. helfen auch Optionen wie -fno-inline-small-functions oder das 
Setzten von Inline-Limits?

von xjn (Gast)


Lesenswert?

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 '_').

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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?

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


Lesenswert?

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
}

von xjn (Gast)


Lesenswert?

@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 ...

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.