Fehler C2275: Unzulässige Verwendung dieses Typs als Ausdruck

Lesezeit: 4 Minuten

Seit gestern habe ich einen Kompilierungsfehler für mein C-Projekt. Das Projekt selbst besteht darin, einen Dienst zu erstellen, der einige Aufgaben übernimmt.

Ich weiß nicht, was sich seit gestern geändert hat, aber heute Morgen kann mein Code nicht mehr kompiliert werden.

Hier sind die Fehler, die ich habe:

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

Hier ist der Code, der von diesen Fehlern betroffen ist (von den Zeilen 45 bis 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;
}

Und hier ist der Code meiner ServiceMain-Funktion:

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

Ich konnte keine Antworten finden, die zu meinem Problem passen, kann jemand helfen? Vielen Dank !

Benutzeravatar von rubenvb
rubenvb

Wenn Sie Ihre Quelldateien benennen *.c, geht MSVC davon aus, dass es C kompiliert, was C89 bedeutet. Alle blocklokalen Variablen müssen am Anfang des Blocks deklariert werden.

Zu den Problemumgehungen gehören:

  • Deklarieren/Initialisieren aller lokalen Variablen am Anfang eines Codeblocks (direkt nach einer öffnenden geschweiften Klammer {)
  • Benennen Sie die Quelldateien um in *.cpp oder gleichwertig und als C++ kompiliert.
  • Upgrade auf VS 2013, das lockert diese Einschränkung.

  • Deklarationen müssen nicht am Anfang von a stehen Funktionsie müssen lediglich am Anfang von a stehen Block. Dies: { statement; { declaration; statement; } } gilt auch in C89/C90.

    – Keith Thompson

    20. August 2013 um 15:04 Uhr

  • Ihr erster Absatz muss noch korrigiert werden.

    – Keith Thompson

    20. August 2013 um 18:37 Uhr

  • Ich verwende MSVC2013, um einige C-Dateien als C-Code zu kompilieren, und ich erhalte immer noch den Fehler C2275 für das Mischen von Deklarationen und Initialisierern. Was gibt??

    – Tim Lovell-Smith

    30. Dezember 2013 um 19:40 Uhr

  • Das war mit Version 12.0.21005.1 REL, falls sich später jemand wundert.

    – Tim Lovell-Smith

    30. Dezember 2013 um 21:37 Uhr

  • Es stellte sich also heraus, dass es wirklich ein Fehler war und anscheinend nur passiert, wenn die neue Variable kommt nach eine Blockanweisung ohne geschweiften Klammern. Problemumgehung: Fügen Sie explizite {} Klammern hinzu.

    – Tim Lovell-Smith

    31. Dezember 2013 um 6:57 Uhr


Möglicherweise verwenden Sie eine Version von C, die es nicht zulässt, Variablen mitten in einem Block zu deklarieren. C verlangte früher, dass Variablen am Anfang eines Blocks deklariert werden, nach dem öffnenden { und vor ausführbaren Anweisungen.

Setzen Sie geschweifte Klammern um den Code, wo die Variable verwendet wird.

Das bedeutet in Ihrem Fall:

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

Benutzeravatar von Laurie Stearn
Laurie Stearn

Dieser Fehler trat auf, wenn ein Projekt von einer Installation auf eine andere übertragen wurde (VS2015 => VS2010).
Der C-Code wurde auf der Originalmaschine tatsächlich als C++ kompiliert, auf der Zielmaschine die Einstellung “Default”. Project Properties\C/C++\Advanced\Compile as irgendwie auf C zeigte, obwohl die Quelldatei vom Typ *.cpp war.
In meinem kleinen Programm tauchten Fehler bezüglich der Platzierung im Code bestimmter Typen auf, z HWND und HRESULT sowie auf das unterschiedliche Format von for Schleifen und C++-Konstrukte wie LPCTSTR, size_t, StringCbPrintf und BOOL. Vergleich.
Ändern Sie das “Kompilieren als” aus Default zu Compile as C++ Code (/TP) löste es.

Dadurch erhalten Sie auch “illegale Verwendung dieser Art als Ausdruck”.

FALSCH:

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

KORREKT:

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

Sie wundern sich vielleicht über den Sinn dieses Codes. Durch explizites Umwandeln in den Typ, den ich dachte, als der Compiler einen Fehler auslöste, wurde mir klar, dass ich eine ungarische Notation vor dem Klassennamen ignorierte, als ich versuchte, “this” für ein anderes Objekt an den Konstruktor zu senden. Wenn Sie nach Fehlern suchen, testen Sie am besten alle Ihre Annahmen.

1412740cookie-checkFehler C2275: Unzulässige Verwendung dieses Typs als Ausdruck

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy