Namespaces
Ein nützliches Konzept in C++ sind die
namespaces (= Namensräume).
Damit lassen sich elegant Namenskonflikte vermeiden,
d.h. die mehrmalige Verwendung von gleichen Namen
für Variablen oder Funktionen in verschiedenen Programmbibliotheken,
die im gleichen Programmbereich benutzt werden.
namespace PhysConst
{
const double c = 2.99792458e8;
const double hbar = 6.626068e-34;
const double e = 1.602176462e-19;
...
};
namespace MathConst
{
const double pi = 3.14159265358979;
const double e = 2.71828182845905;
...
};
...
// Verwendung
grad = rad * 180./MathConst::pi;
force = PhysConst::e * PhysConst::e / ( r * r )
In älteren C++ Versionen waren die Bestandteile der sog. C++-Standard–Bibliothek
(
std) der voreingestellte (=default) Namespace, damit konnten direkt alle Elemente der
std–Bibliothek benutzt werden, z.B.
cout, cin, sin(), sqrt(), ....
Bei aktuellen C++ Versionen bzw. Compilern leider nicht mehr der Fall, der
namespace
muss angegeben werden ! Dazu i.W. 2 Möglichkeiten:
- Explizit durch Angabe des Namespaces bei jeder Verwendung, z.B.
std::cout <<"Ausgabe " <
- Generell namespace verfügbar machen mit
using Direktive
using namespace std;
Puristische C++ Programmierer verwenden konsequent explizite Namespace Angabe.
Empfehlung: Für einfache Anwendungsprogramme ist
using namespace std; eigentlich kein Problem.
Aber man sollte es nicht bei Entwicklung von Bibliotheken bzw. Header Dateien verwenden.
Übergabe von Argumenten ans Programm
Nur für Spezialisten
- Argumente können bei Programmaufruf an
main() übergeben
werden
./readarg hallo wie geht es 1 2 345
-
main( int argc, char** argv) erhält Zahl der Parameter
(
argc) und pointer auf strings (
argv) mit den einzelnen
Parametern:
argv[1]="hallo" ... argv[7]="345"
#include <cstdlib>
#include <iostream>
double pow( double x, int n );
int main( int argc, char** argv )
{
for ( int i = 0; i < argc; i++ ) {
cout << "Argument "<< i << " " << argv[i] << endl;
}
}
C Präprozessor
-
#include <iostream> “Holt” System–Header Datei (/usr/include/..)
-
#include "myhead.h" “Holt” eigene Header Datei (aktuelles Verzeichnis)
-
#define MAX_LEN 100
... int a[MAX_LEN] ...
#define PI 3.1415
Definition von Konstanten, gängig in C,
in
C++ besser mit
const
-
#define SQUARE(a) ((a)*(a))
... double x = SQUARE(7*2) ...
Definition von Makros, gängig in C,
in
C++ besser via function templates (später)
-
#ifdef LMU
...
#endif
Bedingtes Kompilieren für Testen, Debuggen, system–spezifische Funktionen, ...
Kompilieren:
g++ -DLMU ...
Was der C++ Compiler macht:
- Präprozessor `included' angegeben Header-files,
alle
#define werden ersetzt
Ausgabe in temporäre Datei.
- Eigentlicher Compiler–Schritt, `Maschinen'–code wird erzeugt
Objektfiles (.o-Endung)
- Linker: Systembibliotheken und ggf. weitere eigene Objektfiles oder
Bibliotheken werden dazugebunden
ausführbares Programm, kann vom Betriebssystem gestartet werden.