GCC: Statements and Declarations in Expressions

16/08/2012 - 18:35 von Thomas Rachel | Report spam
Hallo,

laut http://gcc.gnu.org/onlinedocs/gcc/S...Exprs.html kann man in
GCC so was schreiben:

({ int y = foo (); int z;
if (y > 0) z = y;
else z = - y;
z; })

Soweit so gut.

Nun meine Frage: geht das auch mit Pointern, die in den aktuellen
Stackframe zeigen, oder gibt das Ärger?

Beispiel:

#define myultoa10(val) __extension__({char svalue[12]; ultoa(val,
svalue, 10); })

Hier ist es ja so, daß ich auf dem Stack ein Array namens svalue
allokiere, es per ultoa() befüllen lasse und dann zurückgebe.

Nun habe ich die Befürchtung, daß es zu früh abgeràumt werden könnte.
Daher meine Frage: Kann ich diesen Wert in der kompletten Funktion, die
myultoa10() aufruft, nutzen? Oder nur innerhalb des "engsten"
{}-Bereiches? Oder gar nicht?

Danke,

Thomas
 

Lesen sie die antworten

#1 Achim Peters
16/08/2012 - 21:48 | Warnen spam
Am 16.08.2012 18:35, schrieb Thomas Rachel:
laut http://gcc.gnu.org/onlinedocs/gcc/S...Exprs.html kann man in
GCC so was schreiben:

({ int y = foo (); int z;
if (y > 0) z = y;
else z = - y;
z; })




Das geht nicht nur mit dem gcc so.

Nun meine Frage: geht das auch mit Pointern, die in den aktuellen
Stackframe zeigen, oder gibt das Ärger?

#define myultoa10(val) __extension__({char svalue[12]; ultoa(val,
svalue, 10); })



Makro-Parameter sollte man bei der Verwendung in der Makro-Definition
immer klammern, also
#define myultoa10(val) __extension__({char svalue[12]; ultoa((val),
svalue, 10); })

Das geht aber genauso wenig gut wie

char *
myultoa10( unsigned long val)
{
char svalue[12];
return ultoa( val, svalue, 10 );
}

(Ich hoffe, ich habe die Signatur von ultoa richtig erraten)

Hier ist es ja so, daß ich auf dem Stack ein Array namens svalue
allokiere, es per ultoa() befüllen lasse und dann zurückgebe.



Du gibst nicht das Array zurück, sondern einen Pointer auf einen
Speicherbereich. Und der ist nach dem "}" nicht mehr reserviert und wird
mit hoher Wahrscheinlichkeit in Kürze überschrieben.

Du kannst Dir aber vom Aufrufer einen Bereich mitgeben lassen, wenn Du
Dir bei jedem Aufruf den Parameter "10" sparen willst.

#define myultoa10(store, val) __extension__({ultoa( (val), (store), 10); })

HTH

Bye
Achim

Ähnliche fragen