2012-03-28 8 views
49

Seit gestern habe ich einen Compiling-Fehler für mein C-Projekt konfrontiert. Das Projekt selbst besteht darin, einen Dienst zu erstellen, der einige Aufgaben erledigt.Fehler C2275: Illegale Verwendung dieses Typs als Ausdruck

Ich habe nicht was seit gestern geändert, aber heute Morgen kann mein Code nicht mehr kompilieren.

Hier sind die Fehler, die ich habe:

c:\path\main.c(56): error C2275: 'SERVICE_TABLE_ENTRY' : illegal use of this type as an expression 
c:\program files\microsoft sdks\windows\v7.0a\include\winsvc.h(773) : see declaration of 'SERVICE_TABLE_ENTRY' 
c:\path\main.c(56): error C2146: syntax error : missing ';' before identifier 'DispatchTable' 
c:\path\main.c(56): error C2065: 'DispatchTable' : undeclared identifier 
c:\path\main.c(56): error C2059: syntax error : ']' 
c:\path\main.c(57): error C2065: 'DispatchTable' : undeclared identifier 
c:\path\main.c(57): warning C4047: 'function' : 'const SERVICE_TABLE_ENTRYA *' differs in levels of indirection from 'int' 
c:\path\main.c(57): warning C4024: 'StartServiceCtrlDispatcherA' : different types for formal and actual parameter 1 

der Code von diesen Fehlern betroffen Hier (von Zeilen 45 bis 58):

int main(int ac, char *av[]) 
{ 
    if (ac > 1) 
    { 
     if (!parse_args(ac, av)) 
     { 
     aff_error(ARGUMENTS); 
     return EXIT_FAILURE; 
     } 
    } 
    SERVICE_TABLE_ENTRY DispatchTable[] = {{MY_SERVICE_NAME, ServiceMain}, {NULL, NULL}}; 
    StartServiceCtrlDispatcher(DispatchTable); 
    return EXIT_SUCCESS; 
} 

Und hier ist der Code meiner Servicemain Funktion:

Ich konnte nicht einige Antworten finden, die zu meinem Problem passen, könnte jemand helfen? Vielen Dank !

Antwort

120

Wenn Sie Ihre Quelldateien *.c benennen, geht MSVC davon aus, dass es C kompiliert, was C89 bedeutet. Alle blocklokalen Variablen müssen am Anfang des Blocks deklariert werden.

Abhilfen beinhalten:

  • deklarieren/alle lokalen Variablen zu Beginn eines Codeblocks (direkt nach einer Öffnung Verstrebung {)
  • benennen die Quelldateien *.cpp oder gleichwertig und kompilieren, wie C Initialisieren ++.
  • Upgrade auf VS 2013, die relaxes this restriction.
+0

Ow ok, ich habe diesen Fehler nicht vorher, deshalb habe ich nicht darüber nachgedacht, danke! –

+9

Das ist so archaisch! ... aber danke, ich steckte auch fest. – likejiujitsu

+0

Ich habe gerade die gleiche Einschränkung :(Grrrrrr! –

5

Möglicherweise verwenden Sie eine Version von C, bei der Variablen nicht in der Mitte eines Blocks deklariert werden. In C war es früher erforderlich, dass Variablen am Anfang eines Blocks deklariert wurden, und zwar nach den öffnenden {und vor den ausführbaren Anweisungen.

2

Setzen Sie Klammern um den Code, in dem die Variable verwendet wird.

In Ihrem Fall bedeutet das:

if (ac > 1) 
{ 
    if (!parse_args(ac, av)) 
    { 
     aff_error(ARGUMENTS); 
     return EXIT_FAILURE; 
    } 
} 
{ 
    SERVICE_TABLE_ENTRY DispatchTable[] = {{MY_SERVICE_NAME, ServiceMain}, {NULL, NULL}}; 
    StartServiceCtrlDispatcher(DispatchTable); 
} 
2

Dieser Fehler trat auf, wenn ein Projekt von einer Installation auf einen anderen (VS2015 => VS2010) zu übertragen.
Der C-Code wurde tatsächlich als C++ auf dem ursprünglichen Computer kompiliert, auf dem Zielcomputer zeigte die "Standard" -Einstellung in Project Properties\C/C++\Advanced\Compile as irgendwie auf C, obwohl die Quelldatei vom Typ * .cpp war.
In meinem kleinen Programm erschienen Fehler bezüglich der Platzierung bestimmter Arten im Code, z. HWND und HRESULT sowie auf das unterschiedliche Format von for Schleifen und C++ - Konstrukte wie LPCTSTR,size_t, StringCbPrintf und BOOL. Comparison.
Ändern der "Kompilieren als" von Default zu Compile as C++ Code (/TP) löste es.

0

Dies wird Ihnen auch "illegale Verwendung dieses Typs als Ausdruck" geben.

FALSCH:

MyClass::MyClass() 
{ 
    *MyClass _self = this; 
} 

RICHTIG:

MyClass::MyClass() 
{ 
    MyClass* _self = this; 
} 

Vielleicht haben Sie den Punkt des Codes fragen, sein. Durch das explizite Umwandeln in den Typ, den ich dachte, als der Compiler einen Fehler erzeugte, wurde mir klar, dass ich eine ungarische Notation vor dem Klassennamen ignorierte, als ich "this" an den Konstruktor für ein anderes Objekt senden wollte. Bei der Fehlersuche sollten Sie alle Ihre Annahmen prüfen.

Verwandte Themen