トップページ⇒prog
56コメント12KB

NULLは使っちゃダメ?(C++)

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@1周年NGNG
以前あった、「NULLと’\0'」という、モメまくりのスレッド
http://www.2ch.net/test/read.cgi?bbs=prog&key=954861526
と内容が一部かぶるかもしれませんが、

C++で、NULLは使っちゃダメと
http://www2s.biglobe.ne.jp/~gkimoto/j/oop/part1/ch09_nonull.html
と、ここに書いてありました。

ですが、実際、NULLが使われているプログラムを多く見かけます。
みなさんは、どうお考えですか??
0002名無しさん@1周年NGNG
0 のほうがタイプ数が少なくて良いね。
0003名無しさん@1周年NGNG

NULLが使用禁止になったらプログラマやめるです。
0004>NGNG
0 で書いてあると、
数値としてつかってんだか、
無効ポインタとしてつかってんだか
区別つかないんでやめてほしい。

自分の世界だけで閉じるソースならどっちでもいいけど。

0005>1NGNG
>ですが、実際、NULLが使われているプログラムを多く見かけます。
C++処理系がNULLを0と定義してあれば問題無いです

0006名無しさん@1周年NGNG
0なんかにしないで普通にキャストすればいいのでは・・・
と個人的には思うのだが。
0007名無しさん@1周年NGNG
NULLが宣言してあるヘッダをインクルードするのが面倒だったりするし、
コンパイラ様が結局はやってくださるので単なるコーダ、プログラマは
気にする必要はない。

つーか、こういうのは宗教がらみでしょ(藁)
0008名無しさん@1周年NGNG
NULLのほうが好きだなあ。(素朴)
0009名無しさん@1周年NGNG
ていうか、なんでもかんでも言語仕様にぶちこむC++で
nullキーワードが用意されないのは何か理由があるんでしょうか?
0010名無しさん@1周年NGNG
ANSI CのようにNULLが((void *)0)だとC++では副作用があると
いう話しですから単純な宗教的な問題とはちょっと違うかも
しれませんね。C++で0でないと副作用が出る場合はキャスト
しようがありません。
普通処理系はCモードで((void *)0)@`C++モードで0になるよう
NULLを定義してあるはずなので、NULLを使っていてもその
副作用が問題になることは無いでしょうが、確かNULLでは
無く0を使うようにC++作った方は推奨されていたように
思います。
0011>9NGNG
Stroustrup御大が0が好きなだけだったりしたらヤだぞ。
そういえば、char*みたいな書き方を流行らせてしまったことも気に食わないです。

プログラミング言語C++の5.4.1見たら
char *const cp;
char const* pc;
なんて不統一なスタイル使ってるし。
0012名無しさん@1周年NGNG

>11
char *const cp; と
char const* pc; って意味同じなんだっけ?
0013名無しさん@1周年NGNG
>12
プログラミング言語C++に書いてあります。(知ってるとは思うけど…)

>11
どう書けば統一されたスタイルなの?
0014>1NGNG
オレの知ってる限りではこの混同をはじめたのはWindows用に
Microsoftが出したサンプルからだ。
それからバカがNULLを数値でも使うようになった。
レビューで文句を言っても、マイクロソフトのソースにありますから
なんていわれて腹立ったなー。
今は白痴でもない限り混同しないと思う。
0015>14NGNG
>オレの知ってる限りではこの混同をはじめたのはWindows用に
>Microsoftが出したサンプルからだ。
>それからバカがNULLを数値でも使うようになった。

日本Sunのセミナーテキストにも同じまちがいがあった。
どうしよう。(藁
0016>15NGNG
日本Sunという企業は存在しない。
サンマイクロシステムズ株式会社が正式名だと思うよ。
00171NGNG
うーん。みなさん、どうもです。
結局のところ、この辺の問題ってのは、思想的な要素が大きいんですかね??
どういう副作用があるかってことを知ってる上で、
NULLを使うのなら、まあ問題ないってところですか・・・??
0018>12NGNG
"const cp"ってのが定数なのと、"pc"が定数なのの違いじゃなかったけ。
意味は違ったはずだよ。
0019>13NGNG
11じゃないけど、

char *const cp
って書くなら、
const char* pc
ではなく、
const char *pc
って書けよって話だと思います。文脈からすると。
11さんは、char* p って、型名にアスターつける流儀について
言及されていたような。

ちなみに
char const* pc
は
const char* pc
のtypoっすよね? 俺がC++知らないだけ?
0020名無しさん@1周年NGNG
ポインタを変化できない のと
ポインタの指す内容を変更できない のちがい
002119NGNG
ちなみに・・・

const char *pc
は、const char型へのポインタ。
つまり、*pc = 'a' などのように、pcの指す先の内容を
書きかえることができない。

char *const cp
は、cpは定数(つーかconst)であり、どのような定数かというと、
char *型の定数である、って意味。
だから、cp = &c2 みたいに、cp が別のところを指すように
することはできない。
002219NGNG
あう、かかれてた・・・。
0023名無しさん@1周年NGNG
int A = NULL;
int * p = 0;

うーん、美づぐじぃコード・・(藁
002418NGNG
C++の仕様だと確か、
ex) const char const tmp = 'a';
つー書き方が出来たはず。
002519NGNG
const char
char const

は等価ですね。アホでした。ごめんなさい。
19 の「ちなみに」以降はウソです。
0026VCではこうなってたぞNGNG
stdio.h

/* Define NULL pointer value */

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
0027名無しさん@1周年NGNG
Effective C++ に template を使った NULL の定義があったね。
手元に本ないんで、基本的なアイデアだけだけど・・・

class {
  template <class T>
operator T*() { return (T*)0; }
} NULL;

こんな感じだったかな?
0028名無しさん@1周年NGNG
>どう書けば統一されたスタイルなの?

たしかK&Rの流儀なら
char * const cp;
char const *pc;
な感じになると思うんだけど。

というか、普段char*とかしておきながら、
constがつくとルールを変えるのは俺も気持ち悪すぎると思う。
const多いコードなら、それこそ*の位置がバラバラになるやん。
002928NGNG
あと、
char* p@` q;
char *p@` *q;
の違いの話もあるし。
0030名無しさん@1周年NGNG
typedef char* CHARP;

CHARP p@`q;

ってやるといいー!
0031名無しさん@1周年NGNG
ところで、Stroustrupってなんて読むんでしょう?
ストラウストラップ?
0032名無しさん@1周年NGNG
>typedef char* CHARP;
>CHARP p@`q;

これってどうなるの?
char* p@` q;
char *p@` *q;
のどっちと等価?
0033>31NGNG
ARMを読め。

というのは不親切なので、ARMの冒頭「日本の読者へ」から引用しましょう。
>Bjarne Stroustrup(ビョーン・ストラウストラップ)

っていうか、みんなこれ読んで、初めて読み方が判ったんだよ。
(Bjarneなんて読めるか! ってこの人どこの国、もしくはどこの国系の人?)
0034>32NGNG
当然
char *p@`*q;
と等価。
0035>31NGNG
日本ではね。
本当はストロウストループのほうが近い(と思う)。
0036>32NGNG
逝ってよし。
0037名無しさん@1周年NGNG
ストラウストラップさんのホームページです。
http://www.research.att.com/~bs/homepage.html
デンマーク人だそうです。名前の発音の仕方も書いてあります。
0038>32NGNG
typedef と #define の違いとして良く扱われる例だね。
入門書でも眺めてみたら?
0039たまなしNGNG
ここに張っておこう。

http://hp.vector.co.jp/authors/VA000092/jokes/strup.html
"C++ は全部ネタでした 〜 Bjarne Stroustrup Interview about C++"
0040>39NGNG
俺はその話を初めて読んだんですが、
マジな話、それ自体ネタじゃないんですか?

と思いたい… つーか、ネタだよな。
0041sageNGNG
jokesって書いてあるじゃん
0042名無しさん@1周年NGNG
でも、割と納得できるジョークだ(泣き笑い)
0043名無しさん@1周年NGNG
だが、その目論見も日本では成功していない。
C++プログラマ(多くはMS-VC++の使用を求められる)の平均的な時給は、
20〜30ドル程度に過ぎない。
0044たまなしNGNG
平均が20〜30ドルなら、トップグループは70〜80ドルぐらいなんじゃない?
0045名無しさん@1周年NGNG
「NULLと’\0'」はネタじゃなかったからな〜
あのときは驚いた・・・
0046>41NGNG
でも原文のSubjectには、
(Joke I hope)
って書いてあるね。
真偽はナゾのままなのかな。
つか、読んでる間ニヤニヤしっぱなしだったよ(笑
0047名無しさん@1周年NGNG
キチガイがその記事を理由にC++批判しなけりゃどうでもいい。
0048名無しさん@1周年NGNG
ネタだよね、これ。
ネタだっていってよお!
0049>48NGNG
だから、ジョークだと言っておろうが。
0050>49NGNG
46に戻る。
0051名無しさん@1周年NGNG
>http://www2s.biglobe.ne.jp/~gkimoto/j/oop/part1/ch09_nonull.html
そこの説明レベル低いな
0052>51NGNG
Effective C++にもっと深い考察があったよ。
0053>51NGNG
たしかに。同じ名前で 変数の数も同じな関数作る方が禁じ手だろうに
0054名無しさん@1周年NGNG
プログラム板らしいスレなのでage
0055>50NGNG
本人が否定してるって
0056名無しさん@1周年NGNG
NULLのほうが好きだなあ。(素朴)
■ このスレッドは過去ログ倉庫に格納されています