错误C2275:将此类型非法用作表达式
从昨天开始,我的C项目一直面临编译错误。项目本身包括创建一个服务来完成一些任务 我不知道从昨天起发生了什么变化,但今天早上,我的代码无法再编译了 以下是我的错误:错误C2275:将此类型非法用作表达式,c,visual-studio-2010,winapi,service,compiler-errors,C,Visual Studio 2010,Winapi,Service,Compiler Errors,从昨天开始,我的C项目一直面临编译错误。项目本身包括创建一个服务来完成一些任务 我不知道从昨天起发生了什么变化,但今天早上,我的代码无法再编译了 以下是我的错误: 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) :
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行):
下面是我的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);
}
我找不到适合我问题的答案,有人能帮我吗?谢谢 > P>您可能使用的是不允许在块中间声明变量的C版本。C过去要求在块的顶部,在开始{和可执行语句之前声明变量。当您命名源文件时,
*.C
,MSVC假定它正在编译C,这意味着C89。所有块局部变量都需要在块的开头声明
解决办法包括:
- 在代码块的开头声明/初始化所有局部变量(直接在打开的大括号之后{)
- 将源文件重命名为<代码> *.CPP或等效,并编译为C++ + < /LI>
- 升级到VS 2013,其中
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++,在目标机器上,“代码”> ProjtProjts\C/C++\Adv\\Cuths> 中的“默认”设置,尽管源文件是*.CP..BR>,但它指向C++。 我的小程序中,在某些类型的代码中出现了错误,例如:代码> HWND < /C>和<代码> HESRESU/> >以及循环的不同格式<代码>,C++构造如<代码> LPCTSTR,<代码> >代码> SIEZYT ,<代码> StrugCBPROTFF 和<代码> BOOL… 将“编译为”从“代码>默认 >代码>编译为C++代码(/TP)解决它。
这也会给您“非法使用这种类型作为表达式”。 错误:
MyClass::MyClass()
{
*MyClass _self = this;
}
MyClass::MyClass()
{
MyClass* _self = this;
}
正确:
MyClass::MyClass()
{
*MyClass _self = this;
}
MyClass::MyClass()
{
MyClass* _self = this;
}
你可能想知道这段代码的意义。当编译器抛出错误时,通过显式强制转换到我认为是的类型,我意识到我在尝试发送“this”时忽略了类名前面的匈牙利符号
查找bug时,最好测试所有假设。声明不需要位于函数的开头,它们只需要位于块的开头。这:
{statement;{declaration;statement;}
即使在C89/C90中也是有效的。您的第一段仍然需要修复。我正在使用MSVC2013将一些.C文件编译为C代码,并且在混合声明和初始值设定项时仍然会出现错误C2275。给出了什么?这是在版本12.0.21005.1 REL中出现的,以防稍后有人怀疑。因此,事实证明这确实是一个错误,而且显然只有在新变量位于不带大括号的block语句之后。解决方法:添加显式{}大括号。谢谢,这解决了我的问题!