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

时间:2012-03-28 08:18:06

标签: 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) : 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);
}

我无法找到适合我问题的答案,有人可以帮忙吗?谢谢!

5 个答案:

答案 0 :(得分:134)

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

解决方法包括:

  • 在代码块的开头声明/初始化所有局部变量(直接在左括号{之后)
  • 将源文件重命名为*.cpp或等效文件,并编译为C ++。
  • 升级到VS 2013,relaxes this restriction

答案 1 :(得分:6)

您可能正在使用不允许在块中间声明变量的C版本。 C曾经要求在打开之后{和可执行语句之前'在块的顶部声明变量。

答案 2 :(得分:2)

在使用变量的代码周围加上大括号。

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

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

答案 3 :(得分:2)

将项目从一个安装转移到另一个安装时发生此错误(VS2015 => VS2010) C代码实际上是在原始机器上编译为C ++,在目标机器上编译为"默认" Project Properties\C/C++\Advanced\Compile as中的设置以某种方式指向C,即使源文件的类型为* .cpp 在我的小程序中,关于某些类型的代码中的展示位置会出现错误,例如HWNDHRESULT以及for循环的不同格式,以及LPCTSTR, size_tStringCbPrintf和{{1}等C ++结构}}。 Comparison
更改"编译为"从BOOLDefault解决了这个问题。

答案 4 :(得分:0)

这也将使您非法使用此类型作为表达式"。

<强> WRONG:

MyClass::MyClass()
{
   *MyClass _self = this;
}

<强>正确:

MyClass::MyClass()
{
   MyClass* _self = this;
}

您可能想知道该代码的重点。通过显式地转换为我认为的类型,当编译器抛出错误时,我意识到在尝试发送&#34;这个&#34;时,我忽略了在类名前面的一些匈牙利符号。 到另一个对象的构造函数。寻找漏洞时,最好测试你的所有假设。