错误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(例如HWND
和HRESULT
)以及for
循环的不同格式,以及C ++结构(如LPCTSTR,
size_t
, StringCbPrintf
和BOOL
代码放置出现错误。 比较 。
Compile as C++ Code (/TP)
解决它时,将“编译为”从Default
更改为编译。