【问题标题】:error C2275 : illegal use of this type as an expression错误 C2275 : 非法将此类型用作表达式
【发布时间】:2012-04-11 19:31:16
【问题描述】:

从昨天开始,我的 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);
}

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

【问题讨论】:

    标签: c visual-studio-2010 winapi service compiler-errors


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      解决方法包括:

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

      【讨论】:

      • 声明不需要在函数的开头,它们只需要在block的开头。这:{ statement; { declaration; statement; } } 即使在 C89/C90 中也有效。
      • 你的第一段还需要修正。
      • 我正在使用 MSVC2013 将一些 .C 文件编译为 C 代码,但我仍然收到错误 C2275 以混合声明和初始化程序。什么给了??
      • 那是 12.0.21005.1 REL 版本,以防以后有人想知道。
      • 所以事实证明它确实是一个错误,显然它只发生在新变量出现在 没有大括号的块语句之后。解决方法:添加显式 {} 大括号。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          这也会给你“非法使用这种类型作为表达式”。

          错误:

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

          正确:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-25
            • 1970-01-01
            • 2021-10-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多