2010-01-31 15 views
11

Ich schreibe C in Visual Studio 2010. Der Compiler scheint nicht inline-Variablendeklarationen verwenden zu wollen. Der folgende Code erzeugt einen Fehler:Microsoft C Compiler: Inline-Variablendeklaration?

unsigned int fibonacci_iterative(unsigned int n) { 
if (n == 0) { 
    return 0; 
} 
if (n == 1) { 
    return 1; 
} 

unsigned int prev_prev = 0; // error 
unsigned int prev = 1; // error 
unsigned int next = 0; // error 
for (int term_number = 0; term_number < n; term_number++) { 
    unsigned int temp = prev_prev + prev; 
    prev = next; 
    prev_prev = prev; 
    next = temp; 
} 

return next; 
} 

Fehler:

error C2143: syntax error : missing ';' before 'type'

error C2143: syntax error : missing ';' before 'type'

error C2143: syntax error : missing ';' before 'type'

Warum ist das passiert? Gibt es eine Einstellung, um den Compiler nicht so streng zu machen?

Antwort

10

Das Setzen von Deklarationen nach Nicht-Deklarationen ist in C89 nicht erlaubt, obwohl es in C++ und in C99 erlaubt ist (MSVC unterstützt jedoch immer noch nicht C99).

In C89, können Sie einen ähnlichen Effekt erzielen, indem einen verschachtelten Block mit:

unsigned int fibonacci_iterative(unsigned int n) { 
    if (...) { 
    } 

    { 
     unsigned int prev_prev = 0; 
     unsigned int prev = 1; 
     unsigned int next = 0; 
     ... 
    } 
} 
+2

Ein bisschen chaotisch, oder? Der gesamte Rest der Funktion, die auf diese Variablen verweist, muss sich innerhalb des Blocks befinden, damit die Variablen nicht außerhalb des Gültigkeitsbereichs liegen. Wenn es überstrapaziert wird, führt dies zu einem sehr unordentlichen und klammerlastigen Code. –

+0

@Chinmay: Es kommt darauf an. Ja, es könnte enden, für große Blöcke unordentlich zu sein, aber es kann auch für kleine Blöcke nützlich sein, wo einige Variablen nur einen sehr begrenzten Bereich brauchen. – jamesdlin

+0

Wie tragbar ist das? Das scheint so zu sein, als würde es nach Ärger fragen. –

1

Versuchen Sie, es als C++ zu kompilieren. C99 erlaubt es, Variablen anders als am oberen Rand des Bereichs zu deklarieren, aber VC weiß nichts über C99.

+0

Wie Chinmay erwähnt, C und C++ ist nicht vollständig kompatibel auf Quellebene. http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++ – ephemient

1

Inline-Variablendeklarationen werden nur in einem C99-kompatiblen Compiler unterstützt. Microsoft Visual C++ scheint nicht C99-kompatibel zu sein (ref). Sie müssen entweder einen C99-kompatiblen Compiler verwenden (GCC wird Code mit Inline-Variablen kompilieren, wenn er mit -std=c99 verwendet wird) oder Ihre Variablen am Anfang der Funktion deklarieren.

EDIT: Oder versuchen Sie C++ - Modus, wie von akallio vorgeschlagen, obwohl C und C++ nicht miteinander kompatibel sind. Wenn Sie zB C++ - spezifische Schlüsselwörter in Ihrem C-Code verwenden, hat es gewonnen nicht kompilieren.

+1

Schlüsselwort beiseite, verschiedene Regeln über Zeigercasting und 'enum/struct/union' Namespaces können auch dazu führen, dass sicherer C-Code im C++ Modus nicht kompiliert werden kann. Es gibt andere Leckerbissen, wie 'sizeof ('a') == sizeof (int)' in C, aber 'sizeof ('a') == sizeof (char)' in C++, aber in der Praxis ist das keine häufige Ursache von Problemen. – ephemient