C++ Compiler will nicht für mich arbeiten

Tockra

Lt. Commander
Registriert
Dez. 2008
Beiträge
1.063
Hallo Leute,
Ich bin gerade dabei mir Tutorials für C++ durch zu lesen, aber ich habe bereits ein Problem!
Ich habe ein neues Projekt (CLR-Konsolenanwendung (Leider verstehe ich nicht genau was das ist) erstellt.
Daraufhin habe ich im Header "#define <iostream>" genutzt und in der Hauptdatei in der main "cout<<"Test";" hinzugefügt... Nun möchte das Projekt leider nicht compilen und der Editor fragt mich immer, ob ich nicht eine ältere Version compilen möchte!
MfG. T

€: Errorcode: error C2065: 'cout': nichtdeklarierter Bezeichner
 
Zuletzt bearbeitet:
wieso define? du musst doch include?
 
@CLR-Konsolenanwendung: CLR steht für "Common Language Runtime" und ist die Laufzeitumgebung von Microsofts .NET-Framework. Wenn du .NET nicht brauchst würde ich dir für den Anfang "Win32-Konsolenanwendungen" empfehlen.


@Fehlermeldung: Wie der Compiler mitteilt kennt er den Bezeichner "cout" nicht.

Das kommt daher, dass "cout" in einem anderen Namespace (http://de.wikipedia.org/wiki/Namespace), nämlich einem Namens "std", deklariert ist.

Entweder benutzt du den Namespace global durch die folgende Zeile hinter den includes:
Code:
using namespace std;

oder du sprichst "cout" über seinen vollständigen Namen an:
Code:
std::cout << "Test";
 
Oder du nimmst das gute alte printf :P.
 
Wenn er C++ lernen will dann sind cout und die C++ io Stream Bibliotheken schon die richtige Wahl :-)
 
Thx. Mit std. funktionierts ohne Fehler. Da wunder ich mich schon wieso der nette Herr Tutorialschreiber das nicht erwähnt hat.
Wie halte ich denn die Konsole offen? (das altbekannte -t ) ?


PS: Wenn ich eine win 32 Konsole verwende, dann ist anstatt der void main()
eine
Code:
int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}
vorgegeben. Wo ist da der Unterschied? Kann neben dieser Main noch eine normale Main existieren?

PS: Benötigt man dieses I/O System auch in anderen Anwendungen als in Konsolenanwendungen ? Wenn ja wo wird der Text dann ausgegeben?
 
Zuletzt bearbeitet:
Das Konsolenfenster offen halten kann man indem man, wie in anderen Programmiersprachen auch, auf eine Eingabe wartet:
Code:
	cout << "Bitte Eingabe zum Beenden druecken!" << endl;
	cin.get(); // Programm wartet hier bis Drücken der Eingabetaste


Sorry, hatte das wegen neuem Projekt nicht ausprobiert. Richtig wäre, ich würde dir eine leere Win32-Konsolenanwendung empfehlen. Diese erhält man, wenn man beim Erstellen des Projekts unter "Zusätzliche Optionen:" das Häkchen vor "Leeres Projekt" aktiviert.

Danach eine cpp-Datei dem Projekt hinzufügen und folgenden Code rein schreiben:

Code:
#include <iostream> // Präprozessorbefehl (gekennzeichnet durch #) um iostream.h aus Include-Pfad zu inkludieren.

using namespace std; // Funktionen aus std-Namespace direkt verfügbar machen.

int main() { // Programmeinstiegspunkt; Alternativ für Parameter: int main(int argc, char *argv[])
	cout << "Hallo Welt" << endl;


	cout << "Bitte Eingabe zum Beenden druecken!" << endl;
	cin.get(); // Programm wartet hier bis Drücken der Eingabetaste

	return 0;
}

Der andere Kram ist VS-spezifisch und verwirrt am Anfang vermutlich mehr, als dass er nützt. (Compiler-/Umgebungsspezifische Sachen beginnen in C++ per Konvention mit einem oder mehreren _.)


"cout" ist die Standardausgabe. Für gewöhnlich ist das die Eingabeaufforderung in der das Programm gestartet wurde. Wenn man aber z.B. ein GUI-Programm übers Startmenü öffnet, dann fehlt diese Eingabeaufforderung und man sieht ggf. über "cout" ausgegebenen Text nicht. Daher verwenden die meisten GUI-Programme "cout" auch gar nicht. Die Ausgabe lässt sich jedoch auch z.B. in Dateien umlenken.


Wenn du mal in die iostream rein guckst ("iostream" beim include markieren und im Kontextmenü "Dokument ... öffnen"), dann wirst du feststellen, dass dort im Grunde nur 4 Sachen definiert sind: cin (für Eingaben), cout (für Ausgaben) , cerr & clog (für Fehler).
Wenn man diese nicht nutzt braucht man dieses I/O-System also auch nicht inkludieren. Dann wird man aber wahrscheinlich andere I/O-Systeme inkludieren oder sich selber irgendwie um die Ausgabe kümmern.
 
Ich habe gemacht was du gesagt hast, aber jetzt kommt folgender Fehler:
Code:
1>LINK : error LNK2001: Nicht aufgelöstes externes Symbol "_mainCRTStartup".
1>c:\users\tockra\documents\visual studio 2010\Projects\start 2\Debug\start 2.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
1>

Außerdem würde ich gerne wissen, wie ich Headerfiles so erstelle, dass ich diese hinterher auch aufrufen kann und diese im Projektmappenexplorer auch im "Headerdateien" Ordner sind.

PS: Verstehe ich das richtig, dass Header Dateien nur dazu gedacht sind, die Includes etwas leserlicher zu gestalten und damit nicht jede Datei immer wieder mit den selben includes zu gebombt werden muss?


€: Mein code:
Code:
#include <iostream>
using namespace std;

int main() {
	cout <<"Hallo Welt"<<endl;
	cout <<"Drücke Enter"<<endl;
	cin.get();
	return 0;
}
 
Der Fehler hört sich so an, als hättest du kein neues Projekt erstellt, sondern einfach meinen Code in deine zuvor nicht-leere Win32-Konsolenanwendung kopiert. Was nicht funktionieren kann, da in den Projekteinstellungen noch anderes Zeugs steht. Du musst erst ein neues leeres Win32-Konsolenanwendungs-Projekt anlegen und dann darin eine cpp-Datei erstellen.


Achtung im folgenden unterscheide ich zwischen "Ordner" und "Verzeichnis"!

Die Ordner im Projektmappenexplorer sind rein virtuell, d.h. entsprechen nicht umbedingt der Verzeichnisstruktur auf der Festplatte. Quellcode (cpp-Dateien), welcher im Ordner "Quelldateien" abgelegt wurde landet ebenso wie Header (h-Dateien), welche im Ordner "Headerdateien" abgelegt wurden im Stammverzeichnis des Projekts.
Da die Dateien alle im gleichen Verzeichnis liegen kannst du die ganz einfach inkludieren mit:
Code:
#include "meinHeader.h"
(#include <foo> sucht in den Include-Verzeichnissen (Compiler-Optionen), #include "bar" erwartet eine absolute oder relative Pfadangabe.)


Header werden für Deklarationen (Klassen, Structs, Funktionen, Variablen, ...) benutzt; der Quellcode für Definitionen (Implementierung der Member einer Klasse und von Funktionen, ...). Das ist Konvention und guter Stil, wird aber in C++ nicht erzwungen, so dass man auch ganz auf die cpp- oder h-Datei verzichten könnte, wenn der jeweilige Code in dem anderen drin steht - für C++ ist das alles (egal ob Quellcode- oder Header-Datei) einfach nur Code.

Der Sinn der Header ist zum einen um auf ggf. versteckte Implementationen zugreifen zu können, wenn man kompiliertes weitergibt (z.B. DLLs oder LIBs) oder eine Schnittstelle zwischen Modulen eines Programms schaffen möchte.

Zudem helfen Header das Kompilieren zu beschleunigen. Da sich für gewöhnlich am Header nicht so häufig etwas wie im Quellcode etwas ändert, muss dann auch nur der geänderte Quellcode neu kompiliert werden. Während bei Änderungen am Header auch alle Quellcodes neu kompiliert werden müssen, die den geänderten Header inkludieren.
 
Okay nun funktioniert es. Ich habe einfach Strg. + n genutzt um neue Dateien zu erstellen und anscheinend werden diese dann nicht autom. den aktuellen Projekt zugeordnet. Jetzt mache ichs über rechtsklick auf das entsprechende Vz. im Projektmappen Explorer und dann geh ich auf Hinzufügen.

Was ist eig. "cin" bei cin.get? Wenn es ein(e) Objekt/Klasse ist, dann frag ich mich wo diese erzeugt wird?
PS: Was muss ich includen, um auf Befehle wie shutdown oder "Laufwerk öffnen" zugreifen zu können ? Oder ist das in c++ etwas komplizierter?

€² : Habe diesen Code mal ausprobiert, aber leider funkzt er bei mir mal wieder nicht ^^:
Code:
#include <iostream>
#include <cstdlib>

using namespace std;

Code:
#include "header.h"

int main() {
	string beenden;
	cout <<"Bitte geben sie \"Y\" ein !"<< endl;
	cin>>beenden;
	cin.get();
	if(beenden == "Y") {
		cout<<"Du hast Y eingeben!"<<endl;
	} 
	cin.get();
	return 0;
}
Was soll passieren? Wenn ich Y eingebe soll der Text "Du hast Y eingeben!" ausgegeben werden.
Allerdings kommt beim compilen eine Fehlermeldung :
 
Zuletzt bearbeitet:
Tockra schrieb:
Thx. Mit std. funktionierts ohne Fehler. Da wunder ich mich schon wieso der nette Herr Tutorialschreiber das nicht erwähnt hat.

Weil das Tutorial schon etwas älter ist. Namespaces gabs noch nicht immer in C++. Vorher war alles in einem Namensraum.
 
Der Code funktioniert, wenn du
Code:
#include <string>
ergänzt.


Code:
#include <cstdlib>
ist fürs erste überflüssig.


Typischerweise inkludiert jede Datei in C++ die Dateien die Sie selber benötigt. Solche Auslagerungen von includes und using namespace sind würde ich sagen eher ungewöhnlich, da damit häufig eher zu viel includiert wird und bzgl. der namespaces man schneller durch einander kommt.


Woher eine Funktion oder Variable kommt bekommt man heraus in dem man drauf rechts-klickt und "Gehe zur Definition" klickt bzw. F12 drückt und dann immer weiter die jeweiligen Deklarationen untersucht. Dies wird meistens durch viele Präprozessor Ausdrücke schnell sehr unübersichtlich und endet meistens irgendwann in irgendwelchen Windows-API-DLLs-Aufrufen, wo man nicht mehr weiter kommt da man keinen Windows-Quellcode hat.

Wie solche Spielereien wie Laufwerk öffnen gehen, braucht normalerweise kein Mensch und ergooglest du dir am besten. Herunterfahren wirst du wahrscheinlich am besten über die shutdown.exe von Windows realisieren. Die passenden Parameter gibts in der Hilfe oder per Google.

Ein Programm aus C++ heraus kann man z.B. Ausführen über:
Code:
system("%systemroot%\\notepad.exe");
 
Zuletzt bearbeitet:
Habs mal bei mir ausprobiert. Man braucht die gar nicht inkludieren, da das schon indirekt über das #include <iostream> geschieht.
 
Zu der Laufwerkfrage finde ich keine funktionierende Antwort

Hier sind zwei Links, wo auf zwei verschiedenen Varianten beschrieben wird wie man so etwas macht.
CodeProject
Geekpedia

Das Ganze ist aber etwas kompliziert, also solltest du vorher vielleicht die Sprache richtig lernen, bevor du dich mit solchen Themen auseinander setzt!

Gruß
BlackMark
 
Dazu musst du aber nicht gleich mit solchen Sachen anfangen.
Du könntest auch eine Art Taschenrechner programmieren, der dann fragt welche Art von Rechnung du durchführen willst. Das wäre um einiges sinnvoller, als Laufwerk öffnen bzw. PC herunterfahren.

Gruß
BlackMark
 
Meolus schrieb:
Der Code funktioniert, wenn du
Code:
#include <string>
ergänzt.


Code:
#include <cstdlib>
ist überflüssig. Außerdem gehören die Standard-Bibliotheken, die mit einem c beginnen noch zu C. Ich würde jedoch wegen den Namespaces eher die C++ Variante "stdlib" ohne c am Anfang verwenden.[/CODE]

In C++ ist <cstdlib> gegenüber <stdlib.h> den Vorzug zu geben, und zwar exakt weil in cstlib alle Bezeichner in den std-Namespace verlagert worden sind. Warum meinst du, der Threadersteller sollte lieber die alte <stdlib.h> verwenden?
Ergänzung ()

Tockra schrieb:
Ich habe keine <stdlib> ich habe nur eine stdlib.h ...
Ist das die die du meinst ? Wenn ja include ich die mit "" oder mit <> ?

Nicht <stdlib> sondern <cstdlib>. ;) Und normalerweise werden solche System-Header mit spitzen Klammern inkludiert.
 
Tockra schrieb:
PS: Wenn ich eine win 32 Konsole verwende, dann ist anstatt der void main()
eine
Code:
int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}
vorgegeben. Wo ist da der Unterschied? Kann neben dieser Main noch eine normale Main existieren?

PS: Benötigt man dieses I/O System auch in anderen Anwendungen als in Konsolenanwendungen ? Wenn ja wo wird der Text dann ausgegeben?

Das ist die allgemeingültige Form für ANSI und Unicode. Dabei werden die einzelnen Teile jeweils durch ihre durch ANSI/Unicode vorgegebene Form durch Preprocessor Makros ersetzt.

Wenn du int main() verwenden willst, dann musst du in den Projekteinstellungen ANSI wählen. Per Default ist das nämlich auf Unicode eingestellt.
 
Zurück
Oben