Das Beste, was man bei der Programmierung in C tun kann, ist, wenn es möglich ist:
- Lassen Sie Ihr Programm mit einem C-Compiler kompilieren, wobei alle Warnungen aktiviert sind
-Wall
und beheben Sie alle Fehler und Warnungen
- Stellen Sie sicher, dass es keine Variablen gibt, die als
auto
- Dann kompilieren Sie es mit einem C++-Compiler mit
-Wall
y -std=c++11
. Beheben Sie alle Fehler und Warnungen.
- Kompilieren Sie nun wieder mit dem C-Compiler. Ihr Programm sollte nun ohne jede Warnung kompiliert werden und weniger Fehler enthalten.
Mit diesem Verfahren können Sie die Vorteile der strengen Typüberprüfung von C++ nutzen und so die Anzahl der Fehler reduzieren. Insbesondere zwingt diese Prozedur Sie dazu, die stdlib.h
oder Sie erhalten
malloc
nicht in diesem Bereich deklariert wurde
und zwingt Sie außerdem dazu, das Ergebnis von malloc
oder Sie erhalten
ungültige Konvertierung von void*
a T*
oder was auch immer Ihr Zieltyp ist.
Die einzigen Vorteile, die ich beim Schreiben in C anstelle von C++ sehe, sind
- C hat eine gut spezifizierte ABI
- C++ kann mehr Code erzeugen [Ausnahmen, RTTI, Vorlagen, Laufzeit Polymorphismus]
Beachten Sie, dass der zweite Cons im Idealfall verschwinden sollte, wenn Sie die gemeinsame Teilmenge von C zusammen mit der statisch polymorphes Merkmal.
Für diejenigen, die strenge C++-Regeln unbequem finden, können wir die C++11-Funktion mit abgeleiteten Typen verwenden
auto memblock=static_cast<T*>(malloc(n*sizeof(T))); //Mult may overflow...
35 Stimmen
stackoverflow.com/q/7545365/168175
9 Stimmen
Gussformen sind böse. Ich sehe so viele Abdrücke im Code, die nur das Ergebnis einer schlechten Programmierpraxis sind. Wann immer Sie einen Cast einfügen müssen, sollten Sie sich als erstes fragen, was hier falsch ist. Ist alles so deklariert, wie es sein sollte? Wenn ja, wäre kein Cast erforderlich, also ist etwas falsch deklariert. Wenn Sie wirklich etwas auf niedriger Ebene mit einzelnen Bytes in einem int oder so tun müssen, ziehen Sie eine Union in Betracht, um auf sie zuzugreifen. Das wird sie genau richtig deklarieren. Als Faustregel gilt: Fügen Sie sie nicht ein, es sei denn, der Compiler beschwert sich. Dann vermeiden Sie sie. Dieses Beispiel wird sich nicht beschweren. void pointer wird zu jedem Typ promoten.
2 Stimmen
@HansLepoeter in C++ sind diese für malloc erforderlich, was meine Vermutung stützt, dass damit etwas nicht stimmt