2010-01-31 10 views
11

Escribo C en Visual Studio 2010. El compilador no parece querer dejarme usar declaraciones de variables en línea. El siguiente código produce un error:Microsoft C Compiler: declaración de variable en línea?

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; 
} 

error:

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

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

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

Por qué sucede esto? ¿Hay alguna configuración para hacer que el compilador no sea tan estricto?

Respuesta

10

La colocación de declaraciones después de las declaraciones no está permitida en C89, aunque está permitida en C++ y en C99 (MSVC aún no es compatible con C99).

En C89, se puede lograr un efecto similar mediante el uso de un bloque anidado:

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

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

Un poco complicado, ¿no? Todo el resto de la función que hace referencia a esas variables deberá estar dentro del bloque para que las variables no queden fuera del alcance. Si se usa en exceso, esto dará lugar a un código muy desordenado y repleto de llaves. –

+0

@Chinmay: depende. Sí, podría terminar siendo desordenado para bloques grandes, pero también puede ser útil para bloques pequeños donde algunas variables solo necesitan un alcance muy limitado. – jamesdlin

+0

¿Qué tan portátil es eso? Parece que podría estar buscando problemas. –

1

Intenta compilarlo como C++. C99 permitirá que se declaren las variables que no sean las principales del alcance, pero VC no sabe acerca de C99.

+0

Como se menciona Chinmay, C y C++ no son totalmente compatibles a nivel fuente. http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++ – ephemient

1

Las declaraciones de variables en línea solo se admiten en un compilador compatible con C99. Microsoft Visual C++ no parece ser compatible con C99 (ref). Tendrás que usar un compilador compatible con C99 (GCC compilará código con variables en línea cuando se usa con -std=c99) o declarar tus variables en la parte superior de la función.

EDITAR: O prueba el modo C++, como sugiere akallio, aunque C y C++ no son estrictamente compatibles entre sí, así que si (por ejemplo), utilizas cualquier palabra clave específica de C++ en tu código C, ganó compilar

+1

Dejando a un lado las palabras clave, diferentes reglas sobre el puntero y los espacios de nombres 'enum/struct/union' también pueden hacer que el código C no se compile en el modo C++. Hay otras cositas, como 'sizeof ('a') == sizeof (int)' en C pero 'sizeof ('a') == sizeof (char)' en C++, pero en la práctica eso no es una causa común de problemas. – ephemient

Cuestiones relacionadas