5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

なぜC++はあんなに難しいのか?

1 :デフォルトの名無しさん:2001/02/21(水) 21:21
なぜC++はあんなに難しいのか?

オブジェクト指向やUMLを理解し
巨大な仕様のC++を理解し
モノを作るのは骨が折れます。

C++ってCと比べて(あえてこう書かせてもらう)成功したと
言えるのでしょうか?
普及したから良いものか?
普及したのは良いから?

多重継承ってなに?
純粋仮称関数ってなに?
多態性ってなに?
レイトバインディングってなに?
アーリーバインディングってなに?
フラストレーションが溜まってます。

K&Rとストラウス〜の考え方は違うとおもう今日このごろ。

つうかOOPが理解できない小生のぐちだね。やれやれ。


774 :デフォルトの名無しさん:01/11/05 11:43
結局、みなヌルポインタに0とNULL、どっちを使ってるですか?

775 :デフォルトの名無しさん:01/11/05 11:48
0でしょ。

776 :デフォルトの名無しさん:01/11/05 12:52
NULLはCの規格だしね。

777 :1000!:01/11/05 15:31
1000!

778 :デフォルトの名無しさん:01/11/09 14:36
関数オブジェクト知らんヤツはCoplienのイディオム本読め。
ファンクターについて研究しろ。
それでも分らんかったら、オレが教えたる。
ただし、ティンポ臭くないヤツだけな。

779 :デフォルトの名無しさん:01/11/20 12:21
なるほど。0なんですか。

780 :デフォルトの名無しさん:01/11/20 21:03
私は NULL。

>>776
別スレでも書いたけど NULL は C++ でも null pointer constant と規定されてます。

781 :デフォルトの名無しさん:01/11/21 00:04
>>780
それってCとの互換性という意味しかないですよね?

782 :デフォルトの名無しさん:01/11/21 01:55
>>781
意図が良くわかりませんが、私が 0 ではなく NULL を使うのは「null pointer constant を意図して
書いているのだ」とソースコードを見て分かるようにです。もちろん文法的にはどっちでも OK。

class だけでなく struct が使えるとか、NULL と同じ <cstddef> で定義されている size_t 型、ついで
に sizeof, offsetoff なんかも「C との互換性」という意味しかないっちゃあ無いですね。C++ ならメモ
リ確保するのに malloc + sizeof ではなく new で一発なわけだし。

783 :781:01/11/21 08:47
>>782
C++ではnull pointer constantって必ず0じゃないですか。
だからポインタ変数に0が代入されてるとnull pointer constantってわかりますよね?
ポインタ変数以外にnull pointer constantを使うこともないですよね?
それで、NULLを使うのはCのコードとの互換性と、Cに慣れてる人がコードを
読み書きしやすいって以外に利点はあるのかなと思って。

NULLって別に定数でもなんでもないただの0ですよね?
数字の1とか2を使う変わりに
#define INT_1 1
#define INT_2 2
ってしたほうがint型の1や2を意図してるとは思わないですし…

size_tとかsizeofのかわりに何を使えばいいのかは良くわかりませんが。

784 :デフォルトの名無しさん:01/11/21 10:34
>>783
その1や2がintなのかlongなのかなんてのはどうでもいい話であって、
それが例えば
#define MODE_MASTER 1
#define MODE_SLAVE 2
になっていたら、”モードがマスターである”という意味の1であるという
ことが重要なわけだ。実際にはこのMODE_MASTERは102だろうが8848
だろうがなんでもよくて、ただ一意であることのみが求められる。
同様にNULLも定数0というのは別にどうでもよくて、それがnullポインタ
であるということが重要であり、示されるべき意味なわけ。

785 :781:01/11/21 11:44
>>784
なんでどうでもいいのかわからない。
数字を見ただけじゃ型はわからないですよ。

例が悪かったかも知れませんので、
#define INT_0 0
の場合を考えてみて下さい。

このマクロがないと0が出てきた時に数字の0であると判断できませんよ。

786 :デフォルトの名無しさん:01/11/21 11:56
NULLを使う利点がCで使ってたという歴史的理由以外にあったら教えて下さい。
(ここでは、歴史的理由とはプログラムの互換性やプログラマがNULLを
nullポインタだと知っているということなどを意味します)

NULLとは何か?
ポインタのコンテキストで使えばnullポインタ。
それ以外の場所で使えば、単なる整数リテラル0。

0とは何か?
ポインタのコンテキストで使えばnullポインタ。
それ以外の場所で使えば、単なる整数リテラル0。

787 :デフォルトの名無しさん:01/11/21 12:26
>>786
まさしくその"ポインタのコンテキスト"として使用していることを
明示するためにNULLがある。

788 :デフォルトの名無しさん:01/11/21 12:41
明示すること自体が目的なの?
それって意味ある?
正しく使ってるかどうかはプログラマの責任でしょ?
誰に対して明示してるの?
C言語を使いなれたプログラマだったりしない?
intのコンテキストを明示するINT_1はどうでもいいって言えるのはなぜ?

789 :デフォルトの名無しさん:01/11/21 13:52
780ではないですが、NULL 賛成派なので、反論を試みる。

> それで、NULLを使うのはCのコードとの互換性と、Cに慣れてる人がコードを
> 読み書きしやすいって以外に利点はあるのかなと思って。

それ以外の利点なるものが必要なのか?
利点が1個、欠点が0個。
だったら使う方がいいに決まってる。
使わない理由は何だ?

> 例が悪かったかも知れませんので、
> #define INT_0 0
> の場合を考えてみて下さい。
>
> このマクロがないと0が出てきた時に数字の0であると判断できませんよ。

それはまったくもってそのとおり。今後気を付けましょう。
int(0) とか書けば良いですね。

> NULLとは何か?
> ポインタのコンテキストで使えばnullポインタ。
> それ以外の場所で使えば、単なる整数リテラル0。

事実としてはそうだけど、混乱の元なので
それ以外の場所で使わないで欲しいです。
貴方も使わないでしょう。

> 0とは何か?
> ポインタのコンテキストで使えばnullポインタ。
> それ以外の場所で使えば、単なる整数リテラル0。

そのとおりですが、
私はポインタのコンテキストでは 0 とは書かず、
必ず NULL と書くようにしています。

790 :デフォルトの名無しさん:01/11/21 13:54
続き。

> intのコンテキストを明示するINT_1はどうでもいいって言えるのはなぜ?

1 と書けば間違いなく int です。
long だったら1L だし、
unsigned だったら 1u だし、
char だったら '\x01' です。
1 と書けば間違いなく int です。

しかし 0 は、それだけだと int の 0 か
NULL ポインタ定数か判断できない(可能性がある)。

> 明示すること自体が目的なの?

Yes

> 誰に対して明示してるの?

自分。
チーム開発なら、他のメンバーに対して。
オープンソースにしてるなら、不特定多数に対しても。

> それって意味ある?
> 正しく使ってるかどうかはプログラマの責任でしょ?

意味はある。
正しく使うことはプログラマの責任だが、
後にこれを読む他人(数ヶ月後の自分を含む)の理解を助ける。

読みにくいより読みやすい方がいいに決まってるから使う。
どこか間違ってます?

#もしかすると貴方には読みやすいソースを書くべきという
#心掛けがないのかもしれない。だったら議論は無意味。

791 :デフォルトの名無しさん:01/11/21 14:42
>>783
細かい突っ込みだが C++ の null pointer constant は 0L の可能性もある。

792 :デフォルトの名無しさん:01/11/21 14:44
>>788
> intのコンテキストを明示するINT_1はどうでもいいって言えるのはなぜ?
int の 1 なら 1 で良いから。

そうではなく、別の意味を持つ 1 なら enum なんかで名前を与えるべき。直接マジックナンバーの 1 を
使うのはお勧めできない。

793 :デフォルトの名無しさん:01/11/21 15:09
INT_1の例はちょっと失敗だったかなぁ。
Cには1の実体を表す表現は1しかないから1を1として使ってるでしょ?
同様にnullポインタを表す表現は0しかないじゃないですか。

ちなみに僕は欠点は二つあると考えてます。
一つは、文字が長いこと。タイプ量とかソースの複雑さの意味で。
もう一つは、正しく使われてることを検証できないこと。
これはNULLに限らずマクロ一般に言えますが、
プログラムが正しく動作していてもNULLが正しく使われているとは限りません。
これは読みやすさを損なう原因になると思います。

ソースを読む時のことを考えると、
0しか使わなければ、0が出現した時に整数かポインタか考えれば言いですが、
NULLを使っていれば、0が出現した時とNULLが出現した時に考えなくてはいけません。
これはほとんどただしいコンテキストで使われているときに
(つまりできるだけ正しく使おうと努力してる場合に)
もっともソースを読んでいる人を罠にひっかけやすくなります。

ちなみに別の意味を持つ1はここでは考えてません。
NULLも別の意味ではなくて0の本来の意味をあらわすのに使われてますから。

1の整数リテラルとしての型もここでは意味がないと思います。
0もそれ自体がポインタ型ではありませんし。

794 :デフォルトの名無しさん:01/11/21 15:33
>>793
> 一つは、文字が長いこと。タイプ量とかソースの複雑さの意味で。
それは、変数名も a, b, c とか一文字にしたほうが良い、ということですか?

795 :デフォルトの名無しさん:01/11/21 16:32
>>794
新しく名前を導入する時の話しじゃないですよ?
すでにある二つの名前のうちどちらを選ぶかですので、
もし、
int a;
#define tmp_int_a a
と宣言してあったら、僕はaの方を使います。

796 :デフォルトの名無しさん:01/11/21 17:31
>>795
#define F_ERROR 0
#define F_READ 1
#define F_WRITE 2
#define F_EXCLUSIVE 4

File f;
f.open("foo.txt", F_READ | F_EXCLUSIVE);

よりも

f.open("foo.txt", 5);

の方が妥当というわけですね。

797 :デフォルトの名無しさん:01/11/21 17:41
NULL 派だけど、ここでこれ以上議論しても得るものは無いと思うので、わたしは引くよ。

>>788
もしコーディングスタイルに関する議論に興味があるなら、Microsoft Press から出ている「コードコンプ
リート」、「ライティングソリッドコード」、それに ASCII から出ている「プログラミング作法」といった書籍を
読んでみることを勧めておきます。

798 :デフォルトの名無しさん:01/11/22 01:39
>>797
それはその通りですね。
もっとも、僕はそもそも何かが得られるとは思ってませんでしたが。
ただNULLを(void*)0でなく厳密に0または0Lだと定義しているのは
C++ではNULLを使うことを推奨してないと僕は思ってます。

>>796
以前の書き込みをちゃんと読んでもらえるとわかりますが、
他の意味を持つ場合について議論しているわけではありません。
またconstant foldingを手でやることも主張していません。

799 :デフォルトの名無しさん:01/11/22 01:48
>>798
> ただNULLを(void*)0でなく厳密に0または0Lだと定義しているのは
> C++ではNULLを使うことを推奨してないと僕は思ってます。
どうなんだろうね。規格書は手元にあるけど、これには「なぜそうなったのか」ということは書いてないから
分からんね。

経緯に詳しい人がいたら、なぜ C++ で (void *) から (Foo *) への暗黙の型変換を禁止したのか、理由
を聞いてみたい気がする。

800 :デフォルトの名無しさん:01/11/22 01:53
C++が難しい理由。
階級制度を確立するため。
C++プログラマ>>その他のプログラマ>>>>>エンドユーザ

801 :デフォルトの名無しさん:01/11/22 02:09
俺はNULL使ってますが、

>0しか使わなければ、0が出現した時に整数かポインタか考えれば言いですが、
>NULLを使っていれば、0が出現した時とNULLが出現した時に考えなくてはいけません。

なんか妙な印象を受けました。
0と書かれてた方が、考える手間が発生すると思いますがいかが?

NULLの中身が0だと知ってさえいれば、「値かポインタか」を考える必要はないので、
一体全体、NULLと書くと何を悩むのか疑問です。

ptr = 0;とかかれてたときにこそ悩みます。値を意図したのか、ポインタを意図したのか。

知っていれば悩まないものは知識の問題ですが、
知っていても悩むものは知恵の問題です。

ポインタに0を代入したり、値にNULLを入れていた場合、
それはコーディング規約違反に相当しますね。うちの場合は。
止むに止まれぬ事情でそうしないとならない場合は、コメントつける必要すらあります。
これは使用者のレベルを問うのではなく、ルールだと思うんですが。

0やNULLの使い方に一貫性を持たせられないようなレベルの人は、
もっとしっかり教育したほうがよいと思います。

802 :デフォルトの名無しさん:01/11/22 02:12
>NULLの中身が0だと知ってさえいれば
この仮定ができない。

803 :801:01/11/22 02:12
そこはルール化すべきだと言ってるのです。

804 :デフォルトの名無しさん:01/11/22 02:14
> そこはルール化すべきだと言ってるのです。
だったらcstdioのマクロもってくる必要なんてないだろ。
#define NIL 0
かなんかを定義してソレ使うってコーディング規約にする
とかいう話であれば、801の話はその通りだと思うよ。

805 :デフォルトの名無しさん:01/11/22 02:15
ほほぅ
これが噂の宗教戦争ですか

806 :デフォルトの名無しさん:01/11/22 02:16
801 じゃないけど、
>>804
何に反論してるのか、自分の立場はどうなのかを明記して欲しいな。名無しさんだと、誰が誰だか分からん。

807 :デフォルトの名無しさん:01/11/22 02:17
>>805
Yes. でも、たまに有用な方向に議論が転がることもあるので、敢えて止める必要はなし。

808 :デフォルトの名無しさん:01/11/22 02:18
時々見かけますが、
決められてないからといって、そこには「あらゆる可能性がある」なんて
一種杓子定規な考え方をしてる人は、実務上では大変困ります。

決められてないところは、使っているこちら側が一般的な範囲でルール化
して差し支えないと思いますよ。

NULL == 0 が絶対ではないとして、
一般的に NULL != 0 の可能性を論じる意義ってあるんですか?
その職場、その開発環境で
「NULL = 0 もしくは NULL = (void *)0 と決めましょう。」
と話し合って文書化するだけのことではないの?

NULL = 100 にしましょうなんて言いだすやつ、見たことないですよ。僕は。

809 :デフォルトの名無しさん:01/11/22 02:22
>>808
話のつながりが見えないのですが、あなたは誰ですか?

> NULL = 100 にしましょうなんて言いだすやつ、見たことないですよ。
確かに、そんな間抜けなことを言ったのは「電子のお針箱」ぐらいですな。

810 :デフォルトの名無しさん:01/11/22 02:23
>>809
お針箱たん…ハァハァ
ワラタ

811 :0を使って玄人気分:01/11/22 02:25
つーか最初から予約語nil入れときゃ良かったんだよ

812 :804:01/11/22 02:32
自明とも思えるつまらん主張をわざわざ書くの面倒なんだけど、、
>>804

・C++ではヌルポインタの表現は単に 0 とするのが良い。
・cstdioの NULL が全プラットフォームで 0 とdefineされているという仮定はできない
・数値の0とヌルポインタが区別できないとソースコードが読みにくいという意見がある(俺はとくに感じないが..)

以上から、#define NIL 0 して、ヌルポインタの表現にコレつかうのが
妥当な妥協点なんじゃネーノ?という意見なんだけど。

・NULLを使う為だけに #include <cstdio> なんて書きたくない

というのもあるけど宗教なんちゃらになるからやめとく。

813 :デフォルトの名無しさん:01/11/22 02:32
おいらは 0 派なんだけど(ソースを grep NULL して出てこなかった)
困りそうなのは Foo( int c); Foo( object * p); かな
後者を呼ぶときは意図的に Foo( (object*)0);
なんてしてる。これって正しいのかな。

NULL は…大文字っていうのと(4つ続けて大文字ってのは打ちづらい)
見た目がなんとなく嫌(ワラ。あと定義がごちゃごちゃしてて面倒だから。
0 なんてワンキーですから。

814 :デフォルトの名無しさん:01/11/22 02:33
NULLは0です。
そうで無いとこれまでに作ったものが動かなくなります。

815 :804:01/11/22 02:37
>「NULL = 0 もしくは NULL = (void *)0 と決めましょう。」
>と話し合って文書化するだけのことではないの?
NULLの定義は決めるものでなく与えられるものです。

816 :デフォルトの名無しさん:01/11/22 02:37
まあ、動くからいいじゃん。NULLでも0でも。
プログラムなんて工業製品なんだよ。数理ではない。

817 :デフォルトの名無しさん:01/11/22 02:40
>>813
C++ だと NULL は 0, 0L が一般的だから、

 Foo(NULL);

は Foo(int) 呼び出しになる。これは NULL 使う場合には要注意な点。

というかポインタと整数型で多重定義するのはやめとけ、というのが Effective C++ のアドバイス。

>>812
細かい点だが NULL だけなら <cstddef> の方が。こいつは size_t なんかも定義してるから、なんだ
かんだで読み込んでることが多いな、俺の場合。

818 :デフォルトの名無しさん:01/11/22 02:40
・NULLの内容を仮定できないって言われても、実際0でないNULLに出逢ったことは無いんだが。
・見ただけでポインタと値くらいは区別できたほうがいいと思うんだけどねぇ。(書いた人の意図を知る意味でも)

実務上問題の無い可能性を恐れて、0を書くってのはどーも・・・・。

819 :デフォルトの名無しさん:01/11/22 02:42
>>812
> ・C++ではヌルポインタの表現は単に 0 とするのが良い。
これは、今のところ客観的な理由が示されてない気がする。

C++ の規格書では NULL は C++ null pointer constant と明記されてるから、NULL と書いて問題が
発生することはない。逆に 0 と書いて問題が発生することもないけど。

820 :デフォルトの名無しさん:01/11/22 02:43
if(!p)はif(p==NULL)にしないと駄目?

821 :デフォルトの名無しさん:01/11/22 02:44
>>820
それは別の問題だから、今持ち込むのはやめといた方が。

822 :デフォルトの名無しさん:01/11/22 02:49
#define 0 NULL

823 :813:01/11/22 02:50
>>817
なるほどです。NULL := 0 では意図したのと違うことになりますね。

>というかポインタと整数型で多重定義するのはやめとけ、というのが
そうですね。NULLな人にはちょっと不味いことになりますね。
(object *)NULL なんてのはちょっと…あれですし。

824 :デフォルトの名無しさん:01/11/22 02:50
>>822 ありがと、少しだけ藁たよ。

825 :デフォルトの名無しさん:01/11/22 02:54
(object *)NULL これはこれでよいと思う。
(void *)NULL これは面白くないけどね。

826 :デフォルトの名無しさん:01/11/22 02:54
下らない事で、良くそれだけ話せますね。

827 :デフォルトの名無しさん:01/11/22 02:54
>>820
if( p == 0 ) でもイイと思う
if( p != NULL ) は単に if( p ) と書けます

828 :デフォルトの名無しさん:01/11/22 02:55
fjに帰れ

829 :デフォルトの名無しさん:01/11/22 02:56
>>826
ま、プログラミング言語なんて、くだらない詳細に満ちた道具だからね ;) 特に C++ は、ある程度
詳細を押さえないと、そこらじゅうに口を広げて待っている落とし穴に飲み込まれる。

830 :デフォルトの名無しさん:01/11/22 02:56
数値計算するならC++のほうが便利だよ。

831 :デフォルトの名無しさん:01/11/22 02:57
つまり、
NULL を (void *)0 にしなかった誰かが一番悪いということに・・・・。

832 :デフォルトの名無しさん:01/11/22 02:58
829 は有意義な議論と見せかけるのに必死だ(藁)

833 :820:01/11/22 02:59
>>827
たとえばmallocの戻り値って失敗するとNULLになるけど、
NULLが0じゃないとif(!p)は使えないんだよね?
で、NULLが10とかだと困らない?

834 :デフォルトの名無しさん:01/11/22 02:59
こういうくだらない議論でも、見てる初心者の役に立つことはあるから、
あながち無益という訳でもなかろう。>>826

835 :デフォルトの名無しさん:01/11/22 03:00
#define NULL ((void*)0)

ならば

char* p = NULL;

って書けないから

char* p = 0;

になるね。
といって

#define NULL 0

だと 817 氏が言うような問題がある。

836 :デフォルトの名無しさん:01/11/22 03:00
>>831
いや、C++ だと (void *) から他のポインタ型への暗黙の変換を認めていないから (void *)0 だと
実用上辛すぎ。

>>832
煽りご苦労。

837 :デフォルトの名無しさん:01/11/22 03:02
>>825
安全にするには NULL 派でも 0 派でも
(object *) のキャストをつけるべき、ということなんですね。
このほうが意味合いがはっきりしますし。

838 :デフォルトの名無しさん:01/11/22 03:03
>>836
ていうか暗黙の型変換を容認できなかったからNULLを(void *)0と
定義できなかったんじゃないかって気もするが。

839 :デフォルトの名無しさん:01/11/22 03:04
ってことで、ぼちぼち議論が一周したね。

840 :デフォルトの名無しさん:01/11/22 03:05
>>836
ごめん本気で話してたのね(藁)
NULLはNULLって事で困ったことないから。

841 :デフォルトの名無しさん:01/11/22 03:06
個人的には NULL を使わず 0 で書いてるなぁ。
キャストをいちいち書くのが面倒だから。
そもそも C++ 形式のキャストは書くのが面倒臭い・・・。

842 :デフォルトの名無しさん:01/11/22 03:09
>>841
<reinterpret_cast> とか?
長いですよね。

843 :デフォルトの名無しさん:01/11/22 03:09
>>833
規格上 null pointer value を評価したら偽になることが要請されているから、ANSI C++ 準拠の C++ 処理系
なら、ポインタ型の変数 p に対して

if (!p)
if (p == NULL)

は同じ結果になる。

> 4.12 Boolean conversions
> 1 An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of
> type bool. A zero value, null pointer value, or null member pointer value is converted to false; any
> other value is converted to true.

844 :デフォルトの名無しさん:01/11/22 03:11
>>841
NULL を使うとキャスト必須だが、0 ならキャスト不要な処理系ってあるの?

845 :デフォルトの名無しさん:01/11/22 03:11
>>841
キャストしてるのが、ソース上わかりやすくなるとか言う馬鹿がいたが、
Java並に目障りで、かえって見づらいんじゃ。

846 :デフォルトの名無しさん:01/11/22 03:13
>>817さんへ

0の場合もNULLの場合も、ポインタであることを明示するにはキャストしないとならないのだから、
結局多重定義のときは型変換噛ませるしかないよね。
void Foo(int);
void Foo(void *);

Foo(NULL)
Foo(0)

で呼ばれるのはFoo(int)だし。
つまり、何がいいたいかというと、

Foo((void *)NULL);
Foo((void *)0);
という渡し方をしたい場合は、必ずキャスト必須というのはC++では当たり前と
考えるべきじゃないかと。
よって、0とNULLの議論にはあまり関係ないと考える次第です。

847 :デフォルトの名無しさん:01/11/22 03:14
>>845
どこに、そんなバカがいたんだ?

837 は見やすい/見にくいの話ではなく、そうしないと確実に「まずい」場合だから違うよね。

848 :デフォルトの名無しさん:01/11/22 03:14
>>833
ポインタ演算で 0(NULL) が出てくると
null pointer として扱うルールなので
実際のnull pointerの値とは関係無いらしいです。
NULLが10になるとかいうことはないらしい。

849 :デフォルトの名無しさん:01/11/22 03:15
まず、ポインタ型変数 p があったときに、
p = 0;
としたあと、p のビットが全部 0 だとは限らないです。


850 :デフォルトの名無しさん:01/11/22 03:15
>>844
gcc 使ってるけど 0 なら通るよ。

851 :817:01/11/22 03:15
>>846
念のため。私は NULL 使う人です。

> よって、0とNULLの議論にはあまり関係ないと考える次第です。
同意。

852 :デフォルトの名無しさん:01/11/22 03:17
>>850
NULL だと通らないの?

853 :デフォルトの名無しさん:01/11/22 03:17
>>847
C++の記述形式についての話に決まってんだろ。

854 :デフォルトの名無しさん:01/11/22 03:18
>>852
#define NULL ((void*)0) なら通らない。

855 :デフォルトの名無しさん:01/11/22 03:19
>>853
正直、「キャストしてるのが、ソース上わかりやすくなるとか言う馬鹿」が、どの発言を指しているのか
分からないです。そんな怒らんで、マターリ行って欲しいんだが、ダメ?

856 :820:01/11/22 03:22
>規格上 null pointer value を評価したら
>偽になることが要請されている
なんとっ

>それは別の問題だから
やっと意味がわかりました。

857 :デフォルトの名無しさん:01/11/22 03:24
>>854
それは明確に ANSI C++ の規格に反してる。昔の処理系ならともかく、今時の処理系で

#define NULL ((void*)0)

はないでしょ。

858 :デフォルトの名無しさん:01/11/22 03:27
>>857
windows.h とかその辺でそう宣言しちゃってるからなぁ。

859 :デフォルトの名無しさん:01/11/22 03:27
>>855
つまりね、841の
>そもそも C++ 形式のキャストは書くのが面倒臭い・・・。
とあるでしょ。それで、C++のキャストの記述形式を、
>キャストしてるのが、ソース上わかりやすくなる
と肯定してる人がいたわけよ。で、あんな回りくどい記述は、
>Java並に目障りで、かえって見づらいんじゃ。
と言ったのよ。

860 :デフォルトの名無しさん:01/11/22 03:28
宣言じゃないか。
sage

861 :デフォルトの名無しさん:01/11/22 03:29
これだな。
> 4.10 Pointer conversions
> A null pointer constant is an integral constant expression rvalue of integer type that evaluates to
> zero. (後略)

だから C++ だと NULL は 0, 0L とマクロ定義されていることはあっても (void*)0 と定義されていることは
ありえない。

862 :デフォルトの名無しさん:01/11/22 03:32
>>859
詳しい説明、ありがとう。納得しました。

C++ で static_cast, reinterpret_cast, const_cast を分けたのは英断だと思うけど、文法はもう少し
どうにかして欲しいですね、確かに。

863 :デフォルトの名無しさん:01/11/22 03:32
結局のとこ、月並みなお話として、null pointerを

・NULLと書いてポインタを意識していることを明示する
・0と書いて紛れもなく0であることを明示する

なのかな。お互いの反論要素として、
・NULL != 0 でない可能性は論じるだけ無意味。
・NULLは定義がポインタじゃないから、多重定義の関数で解釈が int になるのは気持ち悪いが、
 どっちみちキャストする以外に直値のポインタを渡す手は無いので、問題なし。

ということで、どちらの反論もやっぱり無意味とくらぁ。

>>854じゃないけど
別に
#define NULL ((void*)0)
にすべきだと言ってるわけじゃないと思うよ。>>857

864 :デフォルトの名無しさん:01/11/22 03:33
修正
×・NULL != 0 でない可能性は論じるだけ無意味。
○・NULL == 0 でない可能性は論じるだけ無意味。

865 :デフォルトの名無しさん:01/11/22 03:33
>>858
うそーん。#ifdef __cplusplus で場合分けしてない? VC6 の <stdio.h> は、こうなってるよ。

#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif

866 :デフォルトの名無しさん:01/11/22 03:36
>>865
あら?そうなってる?
今手元に gcc しかないから分からない(笑)
VC2 ぐらいを使ってたときにそれで文句を言われたような記憶があって
それ以来 0 を使うようにしてるだけなんだけどね。
NULL で OK ならそっち使おっと♪

867 :デフォルトの名無しさん:01/11/22 03:39
windows.hからincludeされてるwindef.hでは

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

ってなってるね。(VC6.0)

868 :デフォルトの名無しさん:01/11/22 03:42
reinterpret_castとか書くのが面倒くさいとかいってる連中はStroustrupの
本を読んでいないことがばれて恥ずかしー立場に置かれている。
ってかカット&ペーストの利用できない環境でプログラミングしてるんじゃ
ないだろうな?

869 :デフォルトの名無しさん:01/11/22 03:46
>>866
最近の gcc だと __null 使ってるよね。

__null はマクロではなくコンパイラが直に理解する null pointer constant で、

int *p = __null;  // OK
int n = __null;  // NG

となる(任意のポインタ型に対する null pointer constant として使える一方で、整数型として評価すると
怒られる)。

個人的には、次の C++ 標準規格に入って欲しい機能の筆頭です。

870 :デフォルトの名無しさん:01/11/22 03:46
宣言と定義の違いって何ですか?

871 :デフォルトの名無しさん:01/11/22 03:48
>>868
プログラミング言語C++の話?そういうこと書いてあるの?
コピペでどうにかできるもんじゃないと思うけどなぁ。

872 :デフォルトの名無しさん:01/11/22 03:48
>>870
ネタ? 本気で質問したいなら、質問スレに行ったほうが良いと思うぞ。

extern int n;  // 宣言
int n;  // 定義

873 :デフォルトの名無しさん:01/11/22 03:50
>>868
あんまりかまいたくないタイプだが、ソースは読みやすいほうがいいだろ
本読んでるぜとか、読んでないだろとか、機能がどうとかじゃない
C++のキャスト書くと、1行でおさまらなくなる場合が多い

874 :デフォルトの名無しさん:01/11/22 03:51
>>869 あ、そんなのあるんだ。知らなかった。
俺も次のC++には入れて欲しいと思う。
boolやtrue,falseもC++標準に入れたんだから、この際徹底的にやって欲しいね。
その場合、単に null がいいなぁ。

875 :デフォルトの名無しさん:01/11/22 03:52
>>874
激同。
でも C++ 自体いつまでメインストリームに残り続けるのかちょっと不安。

341 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)