2009-06-30 9 views
4

Ich frage mich, warum die folgenden nichtstruct initializer, typedef mit Visual Studio

typedef struct { 
    float x, y; 
} complexf; 

typedef union { 
    complexf f; 
    long long d; 
} rope; 

int main(void) 
{ 
    complexf a; 
    rope z = {a}; 
} 

Der Fehler ist in Zeile Seil z = {a} mit Visual Studio arbeiten, nicht von complexf zu schweben umwandeln kann. Wenn das erste Mitglied der Union kein typedef ist, dann funktioniert es. Ist das ein Compilerfehler oder eine dunkle Kante von C?

Antwort

5

ANSI-C-Standard (auch bekannt als C89), 3.5.7 : All

die Ausdrücke in einem initializer für ein Objekt, die statischen Speicher hat Dauer oder in einer Initialisierungsliste für ein Objekt, das Aggregat oder Vereinigung hat Typ soll konstante Ausdrücke sein.

Der letzte Teil dieser Einschränkung wurde in C99 fallen gelassen, was von VS nicht richtig unterstützt wird.

+0

Danke. Ich bin ein wenig überrascht, dass das aber ok ist: seil z; z.f = a; –

+0

Worüber genau sind Sie überrascht? Dass du ganze Strukturen zuordnen kannst? Das ist absolut gültig (auch für Gewerkschaften, aber nicht für Arrays). – Christoph

1

in VS 6.0, wenn ich mit/kompilieren W4 ich

Warnung C4204: Nicht-Standard-Erweiterung verwendet: nicht konstante Aggregatinitialisierung

so dass ich es nicht Standard C und Sie sind in Compiler macht denke abhängig Land.

0

Funktioniert gut auf meinem G++ 3.4.4 auf Cygwin.

Außer der ':' am Ende, die einen Wechsel zu ';' erfordert.
Und ich habe '__int64' zu 'long long' geändert.


Mit meiner stärkeren Ausrichtung auf C für einen solchen Code, würde ich geschrieben habe,

rope z = *(rope *)&a; 

, um es an die C zu zwingen ++ Compiler :-).
Aber tun Sie das nicht ...

Der richtige Weg ist natürlich zu gehen, als David in seinem Kommentar stellt fest,

rope z; z.f = a; 
+0

der Typ Punning through Zeiger ist sehr hässlich - ich habe noch nie einen Fall gesehen, wo es nützlich war. Union ist viel besser für Typ Punning. –

+0

Tatsächlich ist es wahrscheinlich, dass der Compiler die Fehler übersehen hat. Aber ich habe gesehen, dass es benutzt wird. – nik

+0

Ich habe Typ Punning durch Zeiger verwendet wirft mich selbst aus Faulheit, aber mit Gewerkschaften ist vorzuziehen: GCC optimiert sie besser und sie vermeiden mögliche Ausrichtungsprobleme – Christoph

Verwandte Themen