So definieren Sie NULL mit #define

7

Ich möchte NULL in meinem Programm wie

neu definieren %Vor%

Aber diese Definition funktioniert nicht in der folgenden Aussage:

%Vor%
  
    

Fehler: kann nicht von void * in char *

konvertieren   

Was wäre der beste Weg, NULL zu definieren?

    
cppdev 24.02.2010, 11:40
quelle

8 Antworten

16
%Vor%

funktioniert in beiden.

    
nothrow 24.02.2010, 11:49
quelle
28
%Vor%

ist am sichersten, ich sehe keinen Grund dafür, aber wenn du wirklich willst, mach weiter. So machen es C und C ++:

%Vor%

Im Allgemeinen ist die Definition von 0 für NULL eine schlechte Angewohnheit. Sie möchten, dass sie Teil der Sprache ist. C ++ 0x adressiert das.

Dies ist, was Bjarne Stroustrup dazu sagen :

  

Sollte ich NULL oder 0 verwenden?

     

In C ++ ist die Definition von NULL 0,   es gibt also nur eine Ästhetik   Unterschied. Ich bevorzuge es, Makros zu vermeiden,   also benutze ich 0. Ein weiteres Problem mit NULL   ist das manchmal falsch   glaube, dass es anders als 0 ist   und / oder keine ganze Zahl. In Vornorm   Code, NULL war / ist manchmal definiert   etwas ungeeignet und daher   war / muss vermieden werden. Das ist weniger   in diesen Tagen üblich. Wenn du einen Namen haben musst   der Null-Zeiger, nenne es nullptr;   so wird es genannt   C ++ 0x. Dann wird "nullptr" ein sein   Schlüsselwort.

    
Johannes Rudolph 24.02.2010 11:46
quelle
8

Was genau ist das Problem, wenn Sie Ihren NULL von dort bekommen, wo Sie sollen ?, d. h.

%Vor%

oder

%Vor%

Wie in @Johannes Rudolphs Antwort angedeutet, ist jede Art von Trickserei, die Sie machen, wahrscheinlich nicht sehr zukunftssicher angesichts von Dingen wie nullptr usw.

EDIT: während stdlib (und viele andere) ein NULL enthalten sollen, ist stddef der kanonischste Header [und seit Jahrzehnten].

PS Im Allgemeinen ist es nur eine schlechte Idee, sich in diese Art von Tricks einzumischen, es sei denn, Sie haben einen wirklich guten Grund. Du hast das Denken nicht erweitert, das dich dazu gebracht hat, dies zu tun. Wenn Sie einige Details dazu hinzufügen könnten, wird es wahrscheinlich zu besseren Antworten führen. Andere, die die Frage beantworten, sollten dies auch in ihren Antworten darauf hingewiesen haben, aber ich denke, dass FGITW als FGITW am besten funktioniert: D

BEARBEITEN 2: Wie von @Yossarian hervorgehoben: Die einzige Rechtfertigung dafür ist, wenn in einem anderen System in Ihrem System kein NULL in einer entsprechenden sprachunabhängigen Form definiert ist. Naked Compiler ohne Header und / oder wenn Sie Ihre eigene benutzerdefinierte Standard-Bibliothek von Grund auf neu schreiben, sind Beispiele für einen solchen Umstand. (In solch einem blanken Szenario würde ich mit @ lilburnes Antwort gehen (sicher sein, dass 0 so viel wie möglich verwendet wird))

    
Ruben Bartelink 24.02.2010 11:54
quelle
2
%Vor%

funktioniert in C ++

    
Arsen Mkrtchyan 24.02.2010 11:43
quelle
1

Ich denke, dass jeder, der nicht weiß, dass das Setzen eines Zeigers in C / C ++ auf 0 dasselbe ist wie das Setzen auf NULL, nullptr oder irgendein anderes Äquivalent, sollte nicht mit Code herumspielen. Der Unterschied in der Lesbarkeit zwischen

%Vor%

und

%Vor%

ist minimal. Wenn es um Ausdrücke geht, sind die Formulare

%Vor%

sind nicht lesbarer als

%Vor%     
lilburne 24.02.2010 12:50
quelle
1

Tun Sie das nicht. Es gibt nichts, das besagt, dass NULL der Wert Null sein muss, es ist implementierungsspezifisch.

Es könnte ein Wert sein, der das Ende des Speichers darstellt, ein spezieller Platz im Speicher oder sogar ein Objekt, das keinen Wert darstellt.

Dies ist sehr gefährlich, kann die Portabilität unterbrechen und wird sicherlich mit Code-bewussten Editoren verwechselt werden. Es kauft dir nichts, vertraue der Definition deiner Bibliothek.

BEARBEITEN: Evan ist richtig! Der Code selbst sagt Null, unter der Haube kann der Compiler mit implementierungsspezifischen Details machen, was er will. Danke Evan!

    
Walt Stoneburner 25.02.2010 17:46
quelle
0

Im Gegensatz zu dem, was einige Leute hier angeben, ist 0 eine absolut gültige Definition für NULL in C. Daher müssen Sie vorsichtig sein, wenn Sie einer variadischen Funktion NULL als Argument übergeben, da sie möglicherweise als Integer-Wert verwechselt wird 0, endet in der Nichttragbarkeit.

Zypern

BTW, die comp.lang.c FAQ ist eine sehr empfehlenswerte Lektüre für jeden C-Programmierer. Siehe zum Beispiel hier:

Zypern

enthält solche Edelsteine ​​fast vergessener Weisheit wie "Wie oben erwähnt, gibt es einen Nullzeiger für jeden Zeigertyp, und die internen Werte von Nullzeigern für verschiedene Typen können unterschiedlich sein." Das bedeutet, dass Calloc oder Memset KEINE portable Initialisierung für Zeiger sind.

    
Secure 24.02.2010 18:16
quelle
0
%Vor%

ist die perfekte Definition in C

z.B.

%Vor%

verursacht einen Fehler, da ch während der Increment-Anweisung auf nichts zeigt ist dem Compiler bekannt, indem er den Wert des Zeigers in der LOOK-UP-Tabelle als 0

ansieht

Wenn Sie versuchen, diesen Zeiger zu aktualisieren, ändern Sie tatsächlich den Inhalt von CODE-Region, die bei 0 physikalischer Adresse beginnen. Aus diesem Grund beginnt der erste Eintrag der Seitentabelle vor der Code-Region wird leer gehalten

Was genau ist das Problem, wenn Sie Ihren NULL von dort bekommen, wo Sie sollen ?, d. h.

%Vor%

oder

%Vor%

Wie schon in @Johannes Rudolphs Antwort angedeutet, ist jede Art von Trickserei, die Sie tun, wahrscheinlich nicht sehr zukunftssicher angesichts von Dingen wie nullptr etc.

BEARBEITEN: während stdlib (und viele andere) einen NULL enthalten sollen, ist stddef der kanonischste Header [und ist seit Jahrzehnten].

PS Im Allgemeinen ist es nur eine schlechte Idee, sich in diese Art von Tricks einzumischen, es sei denn, Sie haben einen wirklich guten Grund. Du hast das Denken nicht erweitert, das dich dazu gebracht hat, dies zu tun. Wenn Sie einige Details dazu hinzufügen könnten, wird es wahrscheinlich zu besseren Antworten führen. Andere, die die Frage beantworten, sollten dies auch in ihren Antworten darauf hingewiesen haben, aber ich denke, dass FGITW als FGITW am besten funktioniert: D

BEARBEITEN 2: Wie von @Yossarian hervorgehoben: Die einzige Rechtfertigung dafür ist, wenn in einem anderen System in Ihrem System kein NULL in einer entsprechenden sprachunabhängigen Form definiert ist. Naked Compiler ohne Header und / oder wenn Sie Ihre eigene benutzerdefinierte Standard-Bibliothek von Grund auf neu schreiben, sind Beispiele für einen solchen Umstand. (In solch einem knochigen Szenario würde ich @ lilburnes Antwort verwenden (achten Sie darauf, so viel wie möglich zu verwenden))

    
Swapnil 16.06.2011 11:11
quelle

Tags und Links