Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误C2275:将此类型非法用作表达式_C_Visual Studio 2010_Winapi_Service_Compiler Errors - Fatal编程技术网

错误C2275:将此类型非法用作表达式

错误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项目一直面临编译错误。项目本身包括创建一个服务来完成一些任务

我不知道从昨天起发生了什么变化,但今天早上,我的代码无法再编译了

以下是我的错误:

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语句之后。解决方法:添加显式{}大括号。谢谢,这解决了我的问题!