Подтвердить что ты не робот

Ошибка C2275: незаконное использование этого типа в качестве выражения

Со вчерашнего дня я столкнулся с компиляционной ошибкой для моего проекта 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);
}

Мне не удалось найти ответы, которые соответствуют моей проблеме, может ли кто-нибудь помочь? Спасибо!

4b9b3361

Ответ 1

Когда вы называете исходные файлы *.c, MSVC предполагает компиляцию C, что означает C89. Все блок-локальные переменные должны быть объявлены в начале блока.

Временные решения:

  • Объявление/инициализация всех локальных переменных в начале блока кода (непосредственно после открытия скобки {)
  • переименуйте исходные файлы в *.cpp или эквивалент и скомпилируйте как С++.
  • обновление до VS 2013, которое смягчает это ограничение.

Ответ 2

Возможно, вы используете версию C, которая не позволяет объявлять переменные в середине блока. C, используемый для того, чтобы объявлять переменные в верхней части блока после открытия {и перед исполняемыми операциями.

Ответ 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 фактически был скомпилирован как С++ на исходном компьютере, на целевой машине параметр "Default" в Project Properties\C/C++\Advanced\Compile as как-то указывал на C, хотя исходный файл имел тип *.cpp.
В моей небольшой программе возникли ошибки относительно размещения в коде определенных типов, например. HWND и HRESULT, а также в разных форматах циклов for и С++, таких как LPCTSTR, size_t, StringCbPrintf и BOOL. Сравнение.
Изменение "Скомпилировать как" от Default до Compile as C++ Code (/TP) разрешило его.