イマドキのCやC++でヌルポインタってどう扱うの?
true は !=0 であり、C++の場合、NULLより0を使うべきなので前者が良いかと RT @5mingame2: 実は assert(ptr) ではなく assert(ptr != NULL) がベターなのかしらん…?
2011-03-09 23:23:19@torotiti 情報ありがとうございます。組み込み系だとNULLポインタが0以外の場合も見受けられるのですが…そういう場合でもC++で !ptr と書いて問題ない感じでしょうか?
2011-03-09 23:28:35どうやら C++ではポインタと0を比較する場合に、0がヌルポインタを指し示すように変換されてコンパイルされるらしい…恐るべしC++…!
2011-03-09 23:36:24@5mingame2 0自体が、任意のヌルポに変換されることが保証されているので、もしそういう処理系のコンパイラなら、適切な内容に変換されるはず。たぶん。
2011-03-09 23:37:01@5mingame2 @torotiti 「NULL」はあくまでもC言語用マクロであって、C++では「0」と比較するのが正しいと教わりましたが、そもそもassertを使わないで例外を投げる方がスマートな気がします・・、assertを使うメリットも微妙にあるかもしれないけど・・
2011-03-09 23:40:45ヌルポインタの扱いがCとC++で違うのが徐々に見えてきた。今度先生に質問してみんべ。なるべく移植性のあるコードを書きたいがこなへんが限界か…!
2011-03-09 23:41:33@5mingame2 ストロヴストルップ先生が「別に困ったことないよ」と言ってそういう仕様になっていますね。(void*)0とするわけにはいかなかったからだけど。私はNULLではなく0派。
2011-03-09 23:44:29なんと…不勉強で申し訳ない気持ちで一杯です(汗 QT @gorry5 1980年代にあった最初のCからそうだと思いますが… :D
2011-03-09 23:49:03情報ありがとうございます!これは明日から対処せねば…ヌルポインタは0と書く! RT @maruru_h 補足。Cでも別に変わらんみたいですよ。 http://bit.ly/htdIIt
2011-03-09 23:51:40@hira_kuni_45 assertはCのコードをC++でも使い回す例えです。C++の例外等はまだまったく知らないので(汗 Cでもヌルポインタは0と書けばいいみたいですね。びっくし。
2011-03-09 23:54:15@5mingame2 実際、昔は「ヌルポインタが0番地でない」実装のものがあったそうなので…そういう環境でも「ポインタへの0の代入や比較はその環境でのヌルポインタとする」と
2011-03-09 23:55:01@torotiti いま大量のお叱りリプライに埋もれてます(汗 CでもC++でも、ヌルポインタは「0」と書けばコンパイラが正しく解釈してくれ、!ptrなどの比較演算も問題ないと今更ながら理解しました! ツイッター有り難い…
2011-03-09 23:56:51@gorry5 なんら疑問を持たずにNULLマクロを使っていましたが… ヌルポインタとしての0をCもC++も適切に解釈してくれるという感じだったのですね!これから可搬性の高いコードを維持できそうです。 となるとむしろ微妙なのはNULLマクロ…?!
2011-03-09 23:59:16@5mingame2 そんな事は無いと思う、C言語では、NULLが常に「0」のエイリアスとは限らない(とあるプロセッサ{DSPなどに多い}では0x8000などになっている) QT Cでもヌルポインタは0と書け
2011-03-10 00:01:12@5mingame2 @gorry5 Cの時は、#ifdefでNULLマクロにさらにマクロを被せるとか、たまに見ますね。nullptrで統一みたいな。
2011-03-10 00:03:16@DARL_Japan @gorry5 @5mingame2 ANSI-CでNULLは0に統一されたと思います。DEC-VAXだったかなぁ、0じゃない環境。さすがに触ったこと無いです。
2011-03-10 00:03:23@hira_kuni_45 Wikiやこのページを見る限り、Cでも文脈上「0」と書けばヌルポインタとして扱われ、コンパイル時に適切な値に変換される雰囲気ですが…どうでしょうか http://bit.ly/htdIIt
2011-03-10 00:04:49@DARL_Japan @117Florian @5mingame2 Cコンパイラを裸(標準マクロなし)で使うことは一般的にはほとんどないと思うので、素直に標準マクロのNULL定義を利用するのが結局いちばんポータブルなのではないかと
2011-03-10 00:09:49