私はこれから始めます:一貫性は王様です、決定はあなたのコードベースの一貫性より重要ではありません。
C ++では
NULLは、C ++では0または0Lとして定義されます。
C ++プログラミング言語 Bjarne Stroustrup0
NULL
を読んだ場合、割り当てを行うときにマクロを回避するために明示的に使用することをお勧めします。比較で同じことをしたかどうかはわかりませんが、本を読んでからしばらく経っていますif(some_ptr)
明確な比較なしではありますが、私はそれについて曖昧です。
この理由は、NULL
マクロが(ほとんどすべてのマクロと同じように)欺瞞的0
であるためです。その名前が示すように、マクロは実際にはリテラルであり、一意の型ではありません。マクロの回避は、C ++の一般的なガイドラインの1つです。一方、0
整数のように見え、ポインターと比較したり、ポインターに割り当てられたりしたときとは異なります。個人的にはどちらの方法でもかまいませんが、通常は明示的な比較をスキップします(一部の人々はこれを嫌いますが、おそらく貢献者が変更を提案している理由です)。
個人的な感情に関係なく、正しい方法は1つではないため、これは主に最も害の少ない選択肢です。
これは明確で一般的なイディオムであり、私はそれを好みます。比較中に誤って値を割り当ててしまう可能性はなく、明確に読み取れます。
if(some_ptr){;}
これがsome_ptr
ポインター型であることがわかっている場合はこれは明らかですが、整数比較のように見える場合もあります。
if(some_ptr != 0){;}
これは明快で、一般的なケースでは理にかなっています...しかし、それは漏れやすい抽象化でNULL
あり、実際には0
文字通りのものであり、簡単に誤用される可能性があります。
if(some_ptr != NULL){;}
C ++ 0xにはnullptrがあります。これは明示的かつ正確であるため、現在推奨される方法です。偶発的な割り当てに注意してください。
if(some_ptr != nullptr){;}
C ++ 0xに移行できるまでは、これらのメソッドのどれを使用するかを心配するのは時間の無駄だと主張しますが、それらはすべて不十分であり、nullptrが発明された理由です(完璧な転送を伴う一般的なプログラミングの問題とともに) 。)最も重要なことは、一貫性を維持することです。
Cで
Cは別の獣です。
Cでは、NULLは0または((void *)0)として定義できます。C99では、実装で定義されたnullポインター定数を使用できます。そのため、実際には実装のNULLの定義が原因であり、標準ライブラリで検査する必要があります。
マクロは非常に一般的であり、一般に、言語やその他の一般的なプログラミングサポートの欠陥を補うためによく使用されます。言語ははるかに単純で、プリプロセッサへの依存がより一般的です。
この観点からNULL
、Cでマクロ定義を使用することをお勧めします。