Frage

#ifndef MACROS_NULLCHECK_H_
#define MACROS_NULLCHECK_H_

#include <assert.h>

#define NULLCHECK(x) assert(x != (void *) 0);

#endif

Wenn ich den oben genannten Stil als Vorlage zum Deklarieren von Makros verwendet habe, welche Voraussetzungen hätten Sie?

War es hilfreich?

Lösung

  • Setzen Sie die Klammung um das Argument (es verhindert Probleme beim Übergeben von Ausdrücken)

  • nicht sagen; Am Ende (die Verwendung wird natürlicher sein)

    #define nullcheck (x) Assert ((x)! = (void*) 0)

Andere Tipps

Im Allgemeinen sollten Sie immer Makroargumente in Klammern in die Erweiterung einfügen, dh in Ihrem Fall

assert((x) != (void*) 0)

Dies liegt daran, dass wenn Sie es nicht tun (und nicht einfache Variablen), in denen Sie bestehen, die die variable Erweiterung durcheinander bringen können.

Ich würde auch vorschlagen, dass Sie das Semikolon nicht am Ende der Makrodefinition setzen, damit Sie es so nennen müssen

NULLCHECK(pSomething);

Das sieht nur C-ähnlicher und übereinstimmender mit dem Rest Ihres Codes aus.

Eine Änderung, die ich könnte, wäre, die Schließung zu kommentieren #endif:

#endif  // MACROS_NULLCHECK_H_

Es macht es einfacher zu verstehen, was das ist #endif Tut es dort, wenn die Datei länger als ein Bildschirm wird.

Einige gute Makropraktiken aus dem Cert c sichere Codierungs -Wiki:

Pre00-C. Bevorzugen Sie Inline- oder statische Funktionen für funktionsähnliche Makros
Pre01-c. Verwenden Sie Klammern innerhalb von Makros um Parameternamen
Pre02-c. Makro -Ersatzlisten sollten klammern
Pre03-c. Bevorzugen
Pre10-C. Wickeln Sie Multi-Statement-Makros in einer Schleife ein
Pre11-C. Schließen Sie keine einzige Aussage -Makrodefinition mit einem Semikolon ab
Pre31-C. Rufen Sie niemals ein unsicheres Makro mit Argumenten mit Zuordnung, Inkrement, Dekrement, flüchtigem Zugriff oder Funktionsaufruf ein
Pre32-C. Verwenden Sie keine Präprozessoranweisungen innerhalb von Makroargumenten

Sieht gut aus. Es ist ein Muster, das ich viel benutze.

Die Durchsetzung der ; , verwenden

#define NULLCHECK(x) do { assert((X)); } while (0)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top