error C2275 : utilisation illégale de ce type comme 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 !
Vous devez vous connecter pour publier un commentaire.
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 du bloc.Solutions de contournement consiste à:
{
)*.cpp
ou l'équivalent, et de compiler en C++.;-)
{ statement; { declaration; statement; } }
est valable même en C89/C90.Vous utilisez peut-être une version de C qui ne permet pas de variables pour être déclaré au moyen d'un bloc. C utilisé pour exiger que les variables déclarées au sommet d'un bloc, après l'ouverture { et avant d'instructions exécutables.
Mettre des accolades autour du code où la variable est utilisée.
Dans votre cas, cela signifie que:
Cette erreur s'est produite lors du transfert d'un projet à partir d'une installation à l'autre (VS2015 => VS2010).
Le code C a effectivement été compilé en C++ sur la machine d'origine, sur la machine cible le "par Défaut" dans
Project Properties\C/C++\Advanced\Compile as
a été en quelque sorte pointant vers C, même si le fichier source est de type *.rpc.Dans mon petit programme, des erreurs surgi concernant le placement dans le code de certains types par exemple
HWND
etHRESULT
ainsi que sur les différents format defor
des boucles , et des constructions C++ commeLPCTSTR,
size_t
,StringCbPrintf
etBOOL
. Comparaison.La modification de la "Compilation" des
Default
àCompile as C++ Code (/TP)
résolu.Cela permettra également de vous donner "l'utilisation illégale de ce type comme expression".
MAL:
CORRECT:
Vous pourriez être étonnant que le point de ce code. Explicitement à un casting pour le type, je pensais que c'était, quand le compilateur a jeté une erreur, j'ai réalisé que j'étais ignorant certains notation hongroise devant le nom de la classe lors de l'envoi de "ce"
pour le constructeur pour un autre objet. Lors de la chasse au bug, il est préférable de tester toutes vos hypothèses.