Frage zu __attribute__ ((noinline))

Gast #1137480
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
Gast #1137530
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 '_').
Persönliche Seite #1137576
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?
Moderator Persönliche Seite #1137587
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
}
Gast #1137628
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 ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren