定数がコードで主に使用されている場合は、マクロを使用して定数を定義します。なぜ "NULL" はマクロとして定義され、なぜ nul("\0") はマクロとして定義されないのですか?
3 に答える
NUL
おそらく違いを正当化するために使用できる微妙な理由がありますが、ゼロ文字 ( ASCII で名前が付けられている) のマクロに対する需要はまったくないと思います。
NULL
実装が選択した任意の null ポインター定数にすることができます。整数またはポインターの場合があります。そのため、ヌル ポインター定数が必要な場合に使用されますが、どのヌル ポインター定数を使用するかが重要であるという印象を読者に与えたくない場合に使用します。基本的に、ヌルポインターにしたい場合は、ポインターを初期化/割り当てするために使用できます。ポインターが null かどうかをテストするときにも使用できます。
誰もがわざわざ使うわけではありませんNULL
。0
は の許可された値であるため、移植可能に を使用NULL
できる場所であれば、代わりにを使用できます。個人的には、C 言語に. 特に、varargs 関数を渡すときに問題が発生する可能性があります。これは、人々は一般にそれがポインターであると考えており、必要に応じてポインターに変換しますが、varargs 関数はそれを変換しないためです。したがって、ポインターが必要なポインターでない場合は、UB を取得します。スコープ内にプロトタイプがない関数にも同じことが当てはまります。NULL
0
NULL
NULL
あなたが提案するマクロは、常にint
値 0 の に展開されます。「ゼロを記述する方法がもっと必要です」は、提案されたとしても、C 標準委員会が行動を起こすようなものではないように思えます。基本実行セット内の文字に名前を付ける一連のマクロが存在する場合、NUL
そのセット内に 1 つ存在することは理にかなっています。'a'
しかし、人々は代わりにLATIN_LOWERCASE_A
、'\n'
代わりにLINEFEED
、および0
または'\0'
代わりに書くことを喜んでいるようですNUL
。
マクロは、マクロではないものに展開する必要があります。それはずっとカメではありません。
\0
は 8 進文字定数 (バイナリ 0 を表す) であるため、char
. NULL はありません。
NULL
はアクセスできないアドレスを意味し、その内部値は実装に依存します。ただし、コード内でポインターとして使用される場合は常に 0 を表すため、 like のテストif (p == NULL)
は と同じですif (!p)
。