IDL-Schnittstelle
struct
nehmen, die zunächst nur diesen Einzelwert einhält. Dann kann man später relativ problemlos zusätzliche Elemente hinzufügen, ohne den Anwender-Code für den Zugriff auf die bereits existierenden ändern zu müssen. Man muss 'nur' alles neu übersetzen, da sich ja das Datenlayout ändert.
#if defined (...), #elif defined (...), #else, #endif
#if
bzw. einem #elif
aufgeführt werden. Im #else
-Zweig soll immer ein Fehler gemeldet werden. Also zum Beispiel:
#if defined (__x86__) ...irgendwas x86-spezifisches #elif defined (__powerpc__) ...irgendwas ppc-spezifisches #else #error Error: unknown platform #endif
#include <xyz.h> oder #include <cxyz>?
std
, ansonsten haben sie keinen Namespace! Also z.B. nicht #include <stdlib.h>
schreiben, sondern #include <cstdlib>
. Hier alle Includes der Standard-C-Bibliothek in ihrer C++-Formulierung:
<cassert> <cctype> <cerrno> <cfloat> <ciso646> <climits> <clocale> <cmath> <csetjmp> <csignal> <cstdarg> <cstddef> <cstdio> <cstdlib> <cstring> <ctime> <cwchar> <cwctype>
dlfcn.h
oder unistd.h
. Da sollten wir noch mal forschen, ob die überhaupt noch benutzt werden sollen/dürfen und ob es dafür passenden Ersatz für C++ gibt. Ist im Moment aber eher unwichtig!
Includes in Headerfiles
modul.[cc|cpp]
) und nicht in der zugehörigen Header-Datei (modul.h[h]
) includiert werden.
using namespace xyz;
using namespace std;
, ist verboten. Statt dessen muss man also entweder std::string x;
schreiben, oder string explizit mit using std::string
importieren.
using...
in den Default-und den Therapie-USRs.
using...
) in den inkludierenden Sources, z.B. mx-usrs.cc
.
...DeviceAccess::AccData...
.
public, protected, private
. friend
) Klasse aus zugegriffen werden.
friend
) Klasse aus zugegriffen werden.
private
und nur über Methoden schreib- bzw. lesbar sein. Deklarationen von befreundeten Klassen sollen weitgehend vermieden werden (siehe auch Tip 22 in (6)).
static const T statt #define
static const int MY_CONST = 37;
benutzen statt eines #define MY_CONST 37
.
#define MY_CONST 3 + 2
und cout << 2 * MY_CONST
ergibt 8
und nicht 10
, wie man vielleicht erwarten würde, weil der Pre-Compiler nur dummen Textersatz macht, dadurch vor der eigentlichen Compilierung cout << 2 * 3 + 2
entsteht und dann eben Punkt- vor Strichrechnung gilt.#define MY_CONST (3 + 2)
schreiben, damit cout << 2 * (3 + 2)
entsteht!
T& method() oder T* method()?
UsrSet& usrSet()
statt UsrSet* usrSet()
, womit man dann usrSet().findUsr(...)
schreiben kann.
T method(); throw(Exception);
int f(float); throw();
kann man sagen, dass method()
keine Exception wirft.
catch (...)
in der aufrufenden Methode behelfen.
Exception-Text
ACCDEV_ERRORLOCATION
benutzt werden. Etwa so:
throw AccDevException(ODA_ANERROR, ODA_OK, ACCDEV_ERRORLOCATION);
T method() const;
const
deklariert, wenn sie nichts am Objekt (seinen Attributen) ändern.
new, delete
new
angelegt wurde, muss mit delete
wieder freigegeben werden.
auto_ptr, shared_ptr usw. als Funktionsparameter
auto_ptr
, ein shared_ptr
oder ähnliches ist. Siehe hier zur Beschreibung des Problems und hier für einen Lösungsvorschlag.
shared_ptr
wird zum Beispiel in accdevice.hh|.cc
für die Callbacks benutzt.
pthreads
pthread_cleanup_push()
und pthread_cleanup_pop()
bedenken. Ist sowas wie das An- und Abmelden eines Exithandlers für Threads.
Socket-Programmierung
Pointer oder Referenz?
Beachten muss man aber, dass eine einmal gesetzte Referenz nicht mehr zu verändern ist! Ist das nötig, muss man nach wie vor Pointer benutzen!
sndData.assign(n,T(0)) statt sndData.resize(n)
sndData.assign(n, T(0))
verwenden, um die Sendedaten (sndData
oder auch outData
) zu initialisieren, damit es keine void
-Elemete darin gibt, mit denen Userface nix anfangen kann.
Property-Namen
String-Properties
Für das neue System ist das allerdings unschön. Da verwendet man eigentlich Strings, die genau so lang sind wie nötig. Im Moment habe ich aber keine bessere Idee als auf der USR-Seite wirklich mit Blanks auf die notwendige Länge aufzufüllen und diese angehängten Blanks in der Anwendung (auf DeviceAccess-Seite) wieder wegzuschmeißen. Oder gibt's 'ne bessere Idee?
Code-Formatierung
AStyle
reformatiert werden. astyle in.cc
in.cc
. Das Original wird in in.cc.orig
aufbewahrt.
astyle < in.cc > out.cc
in.cc
, lässt die Datei aber unberührt und schreibt das Ergebnis in out.cc
.
C++ -> Indent Line or Region
klicken.
Tools