none
Probleme bei Funktionskompilierung: Fehler C 2065 und C 2448 RRS feed

  • Frage

  • Hallo

    Ich würde gerne unter C++ eine Funktion schreiben die eine Klasse aus der .NET-Klassenbibliothek verwendet(CreateDirectory). Die Deklaration habe ich wie üblich in eine .h gepackt, sie sieht folgendermassen aus:
    void Skript_Ordnererzeugen (String^ pfad);

    Die Deklaration der Funktion lautet wie folgt:
    void Skript_Ordnererzeugen (String^ Pfad)	 
    { 
       try 
    	{
               DirectoryInfo^ FS = Directory::CreateDirectory( Pfad );
    	}	
       catch (IOException^ abfangen1)
    	{
    	   String^ Nachricht = "The directory .........

    Wenn ich das dann aber kompiliere kommt dann folgende Fehlermeldung:
    \Skript_Ordnererzeugen.cpp(1) : error C2065: 'String': nichtdeklarierter Bezeichner
    
    .\Skript_Ordnererzeugen.cpp(1) : error C2065: 'Pfad': nichtdeklarierter Bezeichner
    
    .\Skript_Ordnererzeugen.cpp(2) : error C2448: 
    'Skript_Ordnererzeugen': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein
    bmi.cpp

    Die Zeilenangaben aus der Fehlermeldung stimmen für den Code so wie er dasteht.
    Könnte mir jemand sagen woran das liegt, den ich habe hier 2 C++ Bücher vor mir liegen und komme nicht weiter.

    Vielen Dank im voraus

    BBB
    Montag, 15. März 2010 11:41

Antworten

  • Hallo BlackBoxBRD!

    > Ich würde gerne unter C++ eine Funktion schreiben die eine Klasse aus
    > der .NET-Klassenbibliothek verwendet(CreateDirectory).

    Bist Du Dir sicher das Du weisst, was Du tust?
    C++/CLI macht eigentlich in den wenigsten Fällen sind... und für
    CreateDirectory schon gar nicht...
    Siehe auch:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/


    > \Skript_Ordnererzeugen.cpp(1) : error C2065: 'String': nichtdeklarierter Bezeichner

    Da fehlt dann wohl noch ein
    using namespace System;

    Oder schreibe anstelle von "String" => "System::String".

    > .\Skript_Ordnererzeugen.cpp(1) : error C2065: 'Pfad': nichtdeklarierter Bezeichner

    Das ist dann ein Folgefehler.


    > Könnte mir jemand sagen woran das liegt, den ich habe hier 2 C++ Bücher
    > vor mir liegen und komme nicht weiter.

    Und warum machst Du dann C++/CLI, wenn Du C++ Bücher hast?

    Das sind zwei komplett verschiedene Welten!!!!


    Es wäre besser, Du würdest "CreateDirectory" aus dem PSDK verwenden:
    http://msdn.microsoft.com/en-us/library/aa363855

    Jochen Kalmbach (MVP VC++)
    Montag, 15. März 2010 12:50

Alle Antworten

  • Hallo,

    Kann es sein, dass Du in den Konfigurationseigenschaften deines Projekts (Konfigurationseigenschaften > Allgemein > Common Language Runtime-Unterstützung) keine CLR-Unterstützung ausgewählt hast? Oder dass Du vergessen hast, den verwendeten Namespace anzugeben:

    // Skript_Ordnererzeugen.cpp
    #include "stdafx.h"
    #include "Skript_Ordnererzeugen.h"
    
    using namespace System;
    
    // usw.
    
    


    Marcel

    Montag, 15. März 2010 12:47
  • Hallo BlackBoxBRD!

    > Ich würde gerne unter C++ eine Funktion schreiben die eine Klasse aus
    > der .NET-Klassenbibliothek verwendet(CreateDirectory).

    Bist Du Dir sicher das Du weisst, was Du tust?
    C++/CLI macht eigentlich in den wenigsten Fällen sind... und für
    CreateDirectory schon gar nicht...
    Siehe auch:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/


    > \Skript_Ordnererzeugen.cpp(1) : error C2065: 'String': nichtdeklarierter Bezeichner

    Da fehlt dann wohl noch ein
    using namespace System;

    Oder schreibe anstelle von "String" => "System::String".

    > .\Skript_Ordnererzeugen.cpp(1) : error C2065: 'Pfad': nichtdeklarierter Bezeichner

    Das ist dann ein Folgefehler.


    > Könnte mir jemand sagen woran das liegt, den ich habe hier 2 C++ Bücher
    > vor mir liegen und komme nicht weiter.

    Und warum machst Du dann C++/CLI, wenn Du C++ Bücher hast?

    Das sind zwei komplett verschiedene Welten!!!!


    Es wäre besser, Du würdest "CreateDirectory" aus dem PSDK verwenden:
    http://msdn.microsoft.com/en-us/library/aa363855

    Jochen Kalmbach (MVP VC++)
    Montag, 15. März 2010 12:50
  • Hallo Jochen und Marcel

    Mea culpa, ich habe , wie ich im nachhinein merke ein paar wichtige Angaben vergessen. Ich bin dabei im Rahmen eines HiWi-Jobs ein schon vorhandenes Projekt zu erweitern, das unter C++/CLI geschrieben ist. Daher verwende ich es zwangsweise ebenso wie die Windows Forms.

    Wenn ich wie Marcels Vorschlag umsetze, dann läuft zwar in der .cpp alles soweit, aber dann bekomme ich die folgenden Fehlermeldungen für die .h:

    *\Skript_Ordnererzeugen.h(1) : error C2065: 'String': nichtdeklarierter Bezeichner
    *\Skript_Ordnererzeugen.h(1) : error C2065: 'pfad': nichtdeklarierter Bezeichner
    *\Skript_Ordnererzeugen.h(1) : error C2182: 'Skript_Ordnererzeugen': Unzulässige Verwendung des Typs 'void'
    *\Skript_Ordnererzeugen.h(1) : fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.

    Nun zu deiner Frage Jochen, warum ich C++/CLI mache wenn ich C++ Bücher habe. Eines der Bücher behandelt auch die Grundlagen von C++/CLI. Darüber hinaus noch eine allgemeine Frage. Du schreibst das C++/CLI und C/C++ zwei komplett verschiedene Welten seinen.
    Aber in dem eine Link in deinem Blog wird C++/CLI als Erweiterun von C/C++ beschrieben(und davon bin ich bisher auch immer ausgegangen). Deshalb nun die Frage: Sorgen diese Erweiterungen für eine so großen Unterschied das man da schon von einer "neuen" Sprache reden kann?
    Montag, 15. März 2010 13:30
  • Hallo BlackBoxBRD,

    Wenn ich wie Marcels Vorschlag umsetze, dann läuft zwar in der .cpp alles soweit, aber dann bekomme ich die folgenden Fehlermeldungen für die .h

    Dann mußt Du eben auch dort using namespace System; verwenden, oder - wie Jochen es vorgeschlagen hat - System::String schreiben.


    Marcel
    Montag, 15. März 2010 13:44
  • Hallo BlackBoxBRD!

    > *\Skript_Ordnererzeugen.h(1) : error C2065: 'String': nichtdeklarierter Bezeichner

    Du solltest auch im Header ein
    using namespace System;
    haben, oder es eben in der cpp-Datei vor dem Include des Headers.

    > Deshalb nun die Frage: Sorgen diese Erweiterungen für eine so großen
    > Unterschied das man da schon von einer "neuen" Sprache reden kann?

    Ja.

    Jochen Kalmbach (MVP VC++)
    Montag, 15. März 2010 14:02
  • Dann erkennt er gar nichts mehr und ich bekomme 86 Fehlermeldungen für die .cpp:

    .\Skript_Ordnererzeugen.cpp(10) : error C2065: 'DirectoryInfo': nichtdeklarierter Bezeichner
    .\Skript_Ordnererzeugen.cpp(10) : error C2065: 'FS': nichtdeklarierter Bezeichner
    .\Skript_Ordnererzeugen.cpp(10) : error C2653: 'Directory': Keine Klasse oder Namespace
    .\Skript_Ordnererzeugen.cpp(10) : error C3861: "CreateDirectory": Bezeichner wurde nicht gefunden.
    .\Skript_Ordnererzeugen.cpp(12) : error C2061: Syntaxfehler: Bezeichner 'IOException'
    .\Skript_Ordnererzeugen.cpp(12) : error C2310: catch-Handler muss einen Typ angeben
    ...
    Und das selbe passiert wenn ich das System::String von Jochen verwende.
    Weil du nach der Projektkonfiguration gefragt hast Marcel, die ist auf "Reine MSIL Common Language Runtime-Unterstützung(/clr:pure)" gesetzt. 

    BBB
    Montag, 15. März 2010 14:03
  • Hallo BlackBoxBRD!

    > Aber in dem eine Link in deinem Blog wird C++/CLI als Erweiterun von
    > C/C++ beschrieben(und davon bin ich bisher auch immer ausgegangen).

    Als Ergänzung noch:
    Versuch mal ein "System::String^" in einen std::vector zu packen... wenn
    das gehen würde, dann würde ich auch von einer "Erweiterung" sprechen.
    Das geht aber nicht, somit sind es für mich zwei Welten.


    Jochen Kalmbach (MVP VC++)
    Montag, 15. März 2010 14:03
  • Hallo BBB,


    in Skript_Ordnererzeugen.h:

    using namespace System;
    void Skript_Ordnererzeugen (String^ pfad);
    


    in Skript_Ordnererzeugen.cpp:

    #include "stdafx.h"
    #include "Skript_Ordnererzeugen.h"
    
    using namespace System;
    using namespace System::IO;
    
    void Skript_Ordnererzeugen (String^ Pfad)  
    { 
      try 
     {
      DirectoryInfo^ FS = Directory::CreateDirectory( Pfad );
     } 
     catch (IOException^ abfangen1)
     {
       String^ Nachricht = "The directory...";
     }
    }
    
    

    Dann sollte es gehen (Du kannst natürlich auch nur System als Namespace einbinden und dann IO::DirectoryInfo schreiben).


    Marcel

    Montag, 15. März 2010 14:19
  • Hallo Marcel

    Leider hat dein Vorschlag die Anzahl der Fehler nur auf 76 reduziert. Ich habe dann noch mal zusätzlich den Namespace System::Windows::Forms inkludiert wodurch die Anzahl der Fehler auf 26 reduzieren konnte. Mir ist noch etwas ganz interessantes passiert. Gerade eben beim Testen hab ich auch mal auskommentiert, und dabei ist versehentlich hinter dem Include-Befehl für den Forms-Namespace ein * stehengeblieben.
    Das reduzierte dann die Fehleranzahl auf 3. Folgende Fehler wurden noch angezeigt:

    .\Skript_Ordnererzeugen.cpp(9) : error C2062: 'void'-Typ unerwartet
    .\Skript_Ordnererzeugen.cpp(10) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    .\Skript_Ordnererzeugen.cpp(10) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
     Vielleicht hilft das ja weiter.

    Gruß

    BBB
    Montag, 15. März 2010 14:40
  • Hallo BBB,

    die kleiner Fehleranzahl bedeutet *nicht*, dass Dein Code besser geworden ist.

    Da ich Dir schwer über die Schulter schauen kann, schlage ich vor, dass Du Dein Problem näher definierst. So wie ich das Ganze z.Z. verstehe, hast Du Probleme mit dem Einbinden von Namespaces. Ob System::IO oder System::Windows::Forms, es funktioniert alles nach dem selben Prinzip. Ich glaube nicht, dass du beim Experimentieren in einem bereits vorhandenem Projekt C++ oder C++/CLI erlernen kannst. Es wäre m.E. viel einfacher, eine neue CLR-Konsolenanwendung zu erstellen und dort die ersten Schritte zu wagen.

    Es gibt eine ganze Reihe von Tutorials im Web, z.B.: http://www.functionx.com/cppcli/index.htm. Vielleicht hilft Dir das weiter.

    Marcel
    Montag, 15. März 2010 15:05