Christian Seiler: Fragen zu C++

Beitrag lesen

Hallo Andreas,

Ich habs im Winnt/system32 versucht und das hat auch funktioniert, denn ich denke da gehören DLL´s hin, oder?

wenn sie von mehreren Programmen genutzt werden, ja. Wenn sie nur von einem Programm genutzt werden, nein.

Aber das ist es eigentlich nicht was ich will. Ich habe ja lediglich folgendes Script:

#include <iostream.h>
int main()
{
cout << "Hello World!" << endl;
return 0;
}

Wobei selbst das - wieso muß da "endl" ans Ende? Heißt vermutlich "endline" , aber dafür gibt es doch "\n"?! "endl" muß ich ja verwenden, sonst geht es nicht, aber ich verstehe nicht so ganz wieso, und wieso es dann noch "\n" gibt?!

AFAIK ist endl (schon ewig nix mehr mit iostream gemacht) eine Konstante, die je nach OS anders definiert ist. (UNIX: \n, Windows: \r\n, MAC: entweder \r oder \n\r - erinnere mich nicht mehr so genau)

Genauso wenig verstehe ich warum das ganze in einer Funktion stehen muß, und auch warum diese einen Rückgabewert braucht, denn wenn ich den von 0 auf 1 verändere funktioniert es weiter!?

Die Funktion main() ist immer der Start eines C/C++ Porgramms. Anders als in PHP dürfen außerhalb von Funktionen nur Präprozessoranweisungen, Variablendeklarationen und Typendeklarationen (inkl. class, struct, typedef, etc.) stehen. Der Rückgabewert von main() ist auch der Rückgabewert des Programms. 0 bedeutet "alles ok" und alles andere als 0 bedeutet, dass irgendein Fehler auftrat. Welche Zahl Du für welchen Fehler verwendest, ist egal.

Was heißt das denn genau die "cygwin-API nutzen"? Für das bekloppte Script oben, wie kann es sein dass ich da ne eigene DLL brauche? Vermutlich sind die Standard-Windows DLLs doch mächtig genug um "Hello World" über die Standardausgabe auszugeben, oder?

Die cygwin-API brauchst Du dann, wenn Du über ANSI-C++ und Win32 hinaus gehst. (also POSIX) Dein Skript daoben braucht keine _zusätzlichen_ DLLs, aber _jedes_ Programm unter Windows braucht AFAIK mindestens user.exe (ist eine "Art" DLL) und kernel32.dll.

Das ist mir total egal! Mit Lizenzen etc. kann ich mich später auseinandersetzen, ich würde aber erstmal gerne verstehen wie das ganze funktioniert ;-), vor allem wie ich möglichst einfach ein C++ Programm schreibe, das ohne zusätzliche Voraussetzungen auf einem normalen Windows-Rechner läuft. In meinem Script greife ich ja auf eine Header-Datei zurück(iostream.h), die wird dann beim Kompilieren mit eingearbeitet, so dass Windows damit umgehen kann, oder? Ist das dann abhängig von der DLL?

Nicht ganz. Im Header stehen nur die Deklarationen. Für die Standard-Header hat der Linker (nicht Compiler, obwohl c++ beides macht) automatisch eine Liste der benötigten Bibliotheken (bzw. Referenzen) parat, sonst musst Du mit -l <bibliothek> arbeiten. (wie das jetzt genau unter Cygwin geht, weiß ich aber nicht, hab' bisher auch nur "Hello World" gemacht)

Aber was braucht man für "Hello World" großartiges? Ich will nur irgendwie "Hello World" in der Win-Shell ausgeben lassen, ohne eine extra DLL zu benötigen. Lizenzen sind wie gesagt egal, es geht erstmal um die Funktionalität!

iostream.h ist Teil von Ansi-C++. Daher brauchst Du keine weiteren Bibliotheken und kannst auf Cygwin verzichten.

wie man dann irgendwann daraus an eine GUI kommt

Da gibt's mehrere Möglichkeiten. Zum einen kannst Du auf die Nativen APIs zugreifen (XLib, Win32) aber das ist ein Grauen (Win32 ein klein wenig mehr, aber ich will XLib nicht beschönigen) => daher brauchst Du ein Toolkit, das das ganze für dich macht. Da gibt es QT (gibt's für UNIX unter der GPL und für Windows in 2 Versionen (ich rede jetzt nur mal von kostenloser Software): eine Offizielle "nicht-kommerzielle" Version, die Direkt auf die Windows-API aufsetzt und eine Inoffizielle, die in Cygwin läuft und einen eigenen X-Server für Windows braucht - mit letzterer gibt's auch KDE für Windows) GTK+ (hab' mich noch nicht so mit befasst, schau' mal bei http://www.gimp.org/~tml/gimp/win32/ vorbei für die Windows-Version) und wxWindows (hab' ich nur mal von gelesen)

, und wie man eine richtige Anwendung schreibt, die ein "Gedächtnis" hat, also in PHP brauche ich ja immer einen Session-Mechanismus um Informationen von einem ins andere Script zu übertragen, ich habe mal gehört dass das in C++ anders sei, aber ich habe keine Ahnung. Ich weiß auch das C++ wahnsinnig kompliziert ist(wenn ich selbst bei Hello World Problemem bekomme, au Mann!), und ich weiß auch das gerade die beiden letzen Punkte die ich genannt habe nichts für Anfänger sind, aber das ist so zu sagen mal ein etwas weit gestecktes Ziel.

Naja - fürs Gedächtnis gibt's mehrere Möglichkeiten. Du kannst natürlich immer in eigenen Dateien Daten ablegen. Unter Windows gibts da 2 Varianten: .ini-Files und die Registry. Unter UNIX werden die Daten meinstens unter dem Homedir als .<programmname>rc oder als .<programmname>/<dateiname> abgelegt.

Wie ist das denn unter Unix? Vermutlich gibt es da doch keine DLLs, oder?

Nicht ganz. Es gibt sog. "Shared Objects", die ähnlich funktionieren.

Worauf greift das Programm dann zurück? Kann ich das auf Linux standardmäßig mit einem C-Compiler kompilieren und dass dann auf jedem Unix als "Programm" starten, so wie Tools wie "gzip"...?

Nein. Die Programme brauchen alle mindestens die Libc-Bibliothek. (/lib/libc6*.so) Desweiteren brauchen Sie u.U. noch weitere Bibliotheken. Die libc setzt direkt auf den Linux-Kernel auf. Weitere Bibliotheken setzen meistens auf die libc auf, aber u.U. auch auf den Kernel. Man kann die (alle oder auch nur bestimmte) Bibliotheken theoretisch statisch einkompilieren, aber unter Linux kompilierte Programme sind höchstens in einem Emulator unter anderen UNIX-Derivaten lauffähig, Quellcode-Kompatibilität (d.h. dass man den Quelltext nur noch unter dem anderen System neu übersetzen muss) ist dagegen einfacher: Sie müssen "nur" POSIX-Konform sein.

Grüße,

Christian