56 votes

erreur C2275: utilisation illégale de ce type en tant qu'expression

Depuis hier, j'ai été confronté à une erreur de compilation pour mon projet C. Le projet consiste en la création d'un service qui permettra de faire certaines tâches.

Je n'ai pas ce qui a changé depuis hier, mais ce matin, mon code ne peut pas compiler plus.

Voici les erreurs que j'ai :

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

Voici le code concerné par ces erreurs (à partir de lignes 45 à 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;
}

Et voici le code de mon 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);
}

Je ne parvenais pas à trouver des réponses qui correspondent à mon problème, quelqu'un pourrait-il aide ? Merci !

140voto

rubenvb Points 27271

Lorsque vous nommez vos fichiers source *.c, MSVC suppose qu'il compile en C, ce qui signifie C89. Tous les blocs de variables locales doivent être déclarées au début de vos fonctions.

Solutions de contournement consiste à:

  • déclarant/initialisation de toutes les variables locales au début d'un bloc de code (directement après une accolade ouvrante {)
  • renommer les fichiers source d' *.cpp ou l'équivalent, et de compiler en C++.
  • la mise à niveau vers VS 2013, qui se détend de cette restriction.

8voto

Windows programmer Points 5365

Vous utilisez peut-être une version de C qui n'autorise pas la déclaration de variables au milieu d'un bloc. C exigeait que les variables soient déclarées au sommet d’un bloc, après l’ouverture {et avant les instructions exécutables.

3voto

user1130406 Points 11

Placez des accolades autour du code où la variable est utilisée.

Dans votre cas, cela signifie:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X