错误C2275:非法使用这种types作为expression式

从昨天开始,我一直在为我的C项目面临一个编译错误。 这个项目本身就是创build一个服务来完成一些任务。

我自昨天以来没有发生什么变化,但今天早上,我的代码不能再编译了。

这里是我有的错误:

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 

以下是这些错误所涉及的代码(第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; } 

这里是我的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); } 

我无法find一些适合我的问题的答案,任何人都可以帮忙吗? 谢谢 !

当您命名您的源文件*.c ,MSVC假定它正在编译C,这意味着C89。 所有块本地variables都需要在块的开头声明。

解决方法包括:

  • 在代码块的开头声明/初始化所有的局部variables(直接在开始的括号{
  • 将源文件重命名为*.cpp或等价物,然后编译为C ++。
  • 升级到VS 2013, 放宽这个限制 。

您可能正在使用不允许在块中间声明variables的C版本。 C用于要求variables在开头{和可执行语句之前。

将大括号放在使用variables的代码中。

在你的情况下,这意味着:

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

将项目从一个安装转移到另一个时发生此错误(VS2015 => VS2010)。
C代码实际上在原始机器上被编译为C ++,在目标机器上, Project Properties\C/C++\Advanced\Compile as的“默认”设置被指定为C,即使源文件是* .cpptypes。
在我的小程序中,关于某些types(例如HWNDHRESULT )以及for循环的不同格式,以及C ++结构(如LPCTSTR, size_tStringCbPrintfBOOL代码放置出现错误。 比较 。
Compile as C++ Code (/TP)解决它时,将“编译为”从Default更改为编译。