2012-08-28 15 views
5

Acabo de empezar a usar Visual Studio (obtuve VS 2012 de dreamspark, y no ha pasado mucho tiempo desde que comencé a usar Windows de nuevo) y yo ' Estoy teniendo problemas.Visual Studio "uso ilegal de este tipo como expresión"

que tienen un único archivo llamado "main.c" bajo mi carpeta de archivos de origen que tiene este aspecto:

#include <stdio.h> 

typedef struct S_s S; 
struct S_s { 
    void* x; 
}; 

int main(int argc, char** argv) 
{ 
    int N; 
    scanf("%d", &N); 

    S* s; 
    printf("%p", s); 

    return 0; 
} 

Y cuando trato de instalar me da los siguientes mensajes de error:

Error 3 error C2065: 's' : undeclared identifier c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 13 1 Lecture1 
Error 4 error C2065: 's' : undeclared identifier c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 14 1 Lecture1 
Error 2 error C2275: 'S' : illegal use of this type as an expression c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 13 1 Lecture1 

Lo curioso es que se compila muy bien si hago un comentario sobre la línea scanf.

Creé un "proyecto vacío" en las opciones de "Visual C++", por lo que no estaba seguro de si VS lo compiló como un programa C o C++. Sin embargo, tenía la impresión de que mi código era C/C++ lo suficientemente agnóstico como para compilarlo en C o C++.

¿Qué puedo hacer para que esto se consiga mientras se mantiene la semántica del programa?

+0

He cumplido años para mí ... pero, ¿el tipo debe seguir la estructura a la que hace referencia? –

+0

Parece que intenta compilarlo como c, no como C++. – ryanbwork

Respuesta

14

El código es legal C++ y legal C99, pero no es legal C89. Las declaraciones de variables en C89 deben venir al principio de un bloque, por lo que tener S* s; después de scanf("%d", &N); no es correcto en C89.

+1

Ha sido legal C desde C99. Algunos compiladores no se han actualizado para que coincidan. –

+0

Tienes razón. He corregido la respuesta. – user763305

+0

Recibo este error con MVS 2014 cuando ejecuto una aplicación de 32 ventanas ... ¿Por qué? – BDillan

5

No lo he probado, pero las antiguas reglas de C (anteriores a C99) solo permitían la declaración de variables automáticas al comienzo de un bloque. Por lo tanto, según esas reglas, la scanf interpuesta hace ilegal la declaración S* s. Comentando el scanf "corrige" el problema. Esto siempre ha sido legal en C++.

Cuestiones relacionadas