2012-08-28 4 views
5

Ich habe gerade angefangen Visual Studio zu verwenden (ich habe VS 2012 von dreamspark, und es ist nicht mehr lange her, seit ich wieder Windows benutze) und ich ' Ich habe Probleme.Visual Studio "illegale Verwendung dieses Typs als Ausdruck"

Ich habe eine einzelne Datei mit dem Namen „main.c“ unter meinen Quelldateien Ordner, der wie folgt aussieht:

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

Und wenn ich versuche, es gibt mir die folgenden Fehlermeldungen zu erstellen:

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 

Die lustige Sache ist, dass es gut baut, wenn ich die scanf Linie auskommentieren.

Ich habe ein "leeres Projekt" unter den "Visual C++" Optionen erstellt, so dass ich nicht sicher war, ob VS es als C oder C++ - Programm kompiliert. Ich hatte jedoch den Eindruck, dass mein Code C/C++ agnostisch genug war, dass er in C oder C++ kompilieren sollte.

Was kann ich tun, um dies zu erstellen, während die Semantik des Programms beibehalten wird?

+0

Alter für mich ... aber muss der Typdef der Struktur folgen, auf die er verweist? –

+0

Sieht so aus, als ob es versucht, es als c zu kompilieren, nicht als C++. – ryanbwork

Antwort

14

Der Code ist legal C++ und legal C99, aber nicht legal C89. Variablendeklarationen in C89 müssen am Anfang eines Blocks stehen, daher ist S* s; nach scanf("%d", &N); in C89 nicht OK.

+1

Es ist legal C seit C99. Einige Compiler wurden nicht entsprechend aktualisiert. –

+0

Sie haben Recht. Ich habe die Antwort korrigiert. – user763305

+0

Ich bekomme diesen Fehler mit MVS 2014, wenn eine 32-Windows-Anwendung läuft ... Whyyyy – BDillan

5

Ich habe es nicht versucht, aber alte C-Regeln (vor C99) erlaubten nur die Deklaration von Autovariablen am Anfang eines Blocks. Also unter diesen Regeln macht das dazwischenliegende scanf die Deklaration S* s illegal. Auskommentieren der scanf "behebt" das Problem. Dies war in C++ immer legal.

Verwandte Themen