error C2275: uso ilegal de este tipo como una expresión

Desde ayer, he estado enfrentando un error de comstackción para mi proyecto C. El proyecto en sí consiste en crear un servicio que realizará algunas tareas.

No sé qué ha cambiado desde ayer, pero esta mañana mi código ya no puede comstackrse.

Aquí están los errores que tengo:

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 

Aquí está el código afectado por estos errores (de las líneas 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; } 

Y aquí está el código de mi función 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); } 

No pude encontrar algunas respuestas que se ajustaran a mi problema. ¿Alguien podría ayudarme? Gracias !

Cuando nombra sus archivos fuente *.c , MSVC supone que está comstackndo C, lo que significa C89. Todas las variables locales de bloque deben declararse al comienzo del bloque.

Las soluciones incluyen:

  • declarar / inicializar todas las variables locales al comienzo de un bloque de código (directamente después de un paréntesis de apertura { )
  • cambie el nombre de los archivos fuente a *.cpp o equivalente y compile como C ++.
  • actualizarse a VS 2013, lo que relaja esta restricción .

Es posible que esté utilizando una versión de C que no permita declarar variables en el medio de un bloque. C solía exigir que las variables se declarasen en la parte superior de un bloque, después de la apertura {y antes de las instrucciones ejecutables.

Coloque llaves alrededor del código donde se usa la variable.

En tu caso, eso 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); } 

Este error ocurrió al transferir un proyecto de una instalación a otra (VS2015 => VS2010).
El código C en realidad se compiló como C ++ en la máquina original, en la máquina de destino la configuración “Predeterminada” en Project Properties\C/C++\Advanced\Compile as apuntara de alguna manera a C aunque el archivo fuente era del tipo * .cpp .
En mi pequeño progtwig, aparecieron errores con respecto a la ubicación en el código de ciertos tipos, por ejemplo, HWND y HRESULT , así como en el formato diferente de bucles for , y C ++ construye como LPCTSTR, size_t , StringCbPrintf y BOOL . Comparación .
Cambiar la “comstackción como” de valor Default para Compile as C++ Code (/TP) resolvió.

Esto también le dará “uso ilegal de este tipo como una expresión”.

INCORRECTO:

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

CORRECTO:

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

Puede que te preguntes el objective de ese código. Al convertir explícitamente al tipo que pensé que era, cuando el comstackdor arrojó un error, me di cuenta de que estaba ignorando alguna notación húngara delante del nombre de la clase al tratar de enviar “esto” al constructor para otro objeto. Cuando se busca errores, es mejor probar todas sus suposiciones.