2012-03-28 13 views
49

Da ieri, ho riscontrato un errore di compilazione per il mio progetto C. Il progetto stesso consiste nella creazione di un servizio che realizzerà alcune attività.errore C2275: uso illegale di questo tipo come espressione

Non so cosa sia cambiato da ieri, ma questa mattina il mio codice non può più essere compilato.

Qui ci sono gli errori che ho:

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 

Ecco il codice in questione è da questi errori (da linee da 45 a 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; 
} 

Ed ecco il codice della mia funzione ServiceMain:

void WINAPI ServiceMain(DWORD ac, LPTSTR *av) 
{ 
    gl_ServiceStatus.dwServiceType = SERVICE_WIN32; 
    gl_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; 
    gl_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; 
    gl_ServiceStatus.dwWin32ExitCode = 0; 
    gl_ServiceStatus.dwServiceSpecificExitCode = 0; 
    gl_ServiceStatus.dwCheckPoint = 0; 
    gl_ServiceStatus.dwWaitHint = 0; 
    gl_ServiceStatusHandle = RegisterServiceCtrlHandler(MY_SERVICE_NAME, ServiceCtrlHandler); 
    if (gl_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) 
     return; 
    gl_ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
    gl_ServiceStatus.dwCheckPoint = 0; 
    gl_ServiceStatus.dwWaitHint = 0; 
    SetServiceStatus(gl_ServiceStatusHandle, &gl_ServiceStatus); 
} 

Non riuscivo a trovare alcune risposte che si adattassero al mio problema, qualcuno potrebbe aiutare? Grazie !

risposta

120

Quando si denominano i file di origine *.c, MSVC presuppone che stia compilando C, che significa C89. Tutte le variabili locali del blocco devono essere dichiarate all'inizio del blocco.

Soluzioni alternative includono:

  • dichiara/inizializzare tutte le variabili locali all'inizio di un blocco di codice (direttamente dopo una parentesi aperta {)
  • rinominare i file di origine *.cpp o equivalente e compilare come C++.
  • aggiornamento a VS 2013, che relaxes this restriction.
+0

Ow ok, non ho fatto questo errore prima è per questo che non ci ho pensato, grazie! –

+9

È così arcaico! ... ma grazie, sono rimasto bloccato anch'io. – likejiujitsu

+0

Ho appena raggiunto la stessa limitazione :(Grrrrrrr! –

5

È possibile che si stia utilizzando una versione di C che non consente di dichiarare le variabili nel mezzo di un blocco. C richiedeva che le variabili fossero dichiarate all'inizio di un blocco, dopo l'apertura {e prima delle istruzioni eseguibili.

2

Inserisci parentesi attorno al codice in cui viene utilizzata la variabile.

Nel caso che significa:

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

Questo errore durante il trasferimento di un progetto da un impianto all'altro (VS2015 => VS2010).
Il codice C è stato effettivamente compilato come C++ sulla macchina originale, sul computer di destinazione l'impostazione "Predefinita" in Project Properties\C/C++\Advanced\Compile as puntava in qualche modo a C anche se il file di origine era di tipo * .cpp.
Nel mio piccolo programma, sono comparsi errori relativi al posizionamento nel codice di alcuni tipi, ad es. HWND e HRESULT nonché sul diverso formato dei cicli for e dei costrutti C++ come LPCTSTR,size_t, StringCbPrintf e BOOL. Comparison.
La modifica di "Compila come" da Default a Compile as C++ Code (/TP) è stata risolta.

0

Questo ti darà anche "l'uso illegale di questo tipo come espressione".

SBAGLIATO:

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

CORRETTO:

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

Potreste essere chiedo il punto di tale codice. Specificando espressamente il tipo che pensavo fosse, quando il compilatore ha generato un errore, mi sono reso conto che stavo ignorando alcune notazioni ungheresi davanti al nome della classe quando provavo a inviare "questo" al costruttore per un altro oggetto. Durante la caccia agli insetti, è meglio testare tutte le tue ipotesi.

Problemi correlati