トップページ⇒tech
355コメント99KB

C/C++のこの機能逝ってよし

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん NGNG
 C/C++の滅多に使わん機能(標準ライブラリ含)を語るスレ
 個人的には広域ジャンプ使ったこと無し。
0002デフォルトの名無しさんNGNG
trigraph sequence
0003胴衣NGNG
ああ、それだ!
0004auNGNG
while(1)
0005デフォルトの名無しさんNGNG
多重継承いらない。
特にスーパークラス同士で同じ変数名やメンバ関数名使われると
わけわからなくなってくる。
0006デフォルトの名無しさんNGNG
while(1) じゃなくて

neverendingloop{


}
ていうループを作って欲しいね
0007反抗期NGNG
太重軽傷に関しては、オマエのデザインがぼろいだけ。

while (1), for (;;) なんかは
イディオムとして大昔から定着してるから問題無し!
0008oopNGNG
delete
0009デフォルトの名無しさんNGNG
#define neverendingloop for(;;)
0010デフォルトの名無しさんNGNG
C/C++自体が逝ってよし!
0011デフォルトの名無しさんNGNG
そんなんしはったら困ります
0012デフォルトの名無しさんNGNG
>>5
多重継承の有効的な利用法をまだ知らない厨房発見。
カワイイ(・∀・)!
00135NGNG
>>7 >>12
君たちは少数派だね。

Java, C#, Delphi ほか多数が単継承です。
おれの勝ちは明白ですよ。
0014デフォルトの名無しさんNGNG
0が"null pointer"…
0015デフォルトの名無しさんNGNG
>>12
継承バカ発見。
継承よりも委譲を使おう。
0016デフォルトの名無しさんNGNG
Javaで複数のinterfaceをimplementsしたら、
同名のメソッドやfinal定数が重なって酷い目に合いました。

どうしてこんなクソ言語になったのでしょうか。
開発者も使ってる連中も脳みそ腐ってるんでしょうか。
0017デフォルトの名無しさんNGNG
>>15
継承で書いた方が素直に書けるものは、継承で書いてくれ。
0018デフォルトの名無しさんNGNG
>Java, C#, Delphi ほか多数が単継承です。
>おれの勝ちは明白ですよ。

それらの言語では、貴方のようなドキュソのために
お手軽度を増してあるのです。

やみくもな継承は問題ですが、
mixin 的な使い方はやっぱし捨てがたいです。

>>16 考えなしに継承しちゃあ、だめだめ。
0019あんちOOPNGNG
>>継承で書いた方が素直に書けるものは、継承で書いてくれ
ネットワークライブラリが、ウインドウハンドル
を持ってたり、LANのサーバークラスが勝手に外のDNSを参照
してたりするのは嫌。
継承っていもずる式に依存関係が複雑化していくと、
MFCを見てそう思う。
Mix-Inやテンプレートは重要。
0020デフォルトの名無しさんNGNG
C++バカは多重継承、テンプレート使いすぎでコードの可読性が悪すぎます。
とにかくこれでもかといろいろコードを複雑にして他人を困らせてはほくそえんでいます。
あなたたちは書いて終わりでもデバッグする人のことを考えて下さい。
テク自慢は一人で趣味でやってなさい!
0021 NGNG
継承なんか使わずに変数としてクラスに組みこんでますが何か?
0022デフォルトの名無しさんNGNG
まぁなんというか,新しい物を作ろうとせず,他人の作成物を罵るだけの
人に未来はありませんな。

Ruby 罵倒嵐と同レベル。
0023デフォルトの名無しさんNGNG
>>21
それが「委譲」というやつです。
0024デフォルトの名無しさんNGNG
goto の全てが悪なわけじゃないように、
(多重)継承も全てが悪なわけじゃない。
ホントはそんなことみんなわかってんだべ?
0025デフォルトの名無しさんNGNG
オブジェクト思考がいらないなぁ・・・・
0026デフォルトの名無しさんNGNG
>>24
ああ、わかっているさ。でも、そういったことを分かった上で、
保守性になるべく悪影響がでないようなコードを気遣って書いて
くれるマトモなプログラマがあまりにも少なすぎるので、最後には
goto禁止!多重継承禁止!になっちまう。
元を正せば馬鹿プログラマの自業自得。
0027デフォルトの名無しさんNGNG
delete [] hoge ;
0028 NGNG
>>23
ありがとうございます。勉強になりました。m(_ _)mマジ
0029デフォルトの名無しさんNGNG
C/C++に限らず「gotoは禁止」って言ってる奴ってかなりパーだよな。
0030デフォルトの名無しさんNGNG
>>26
そういう部分部分への対処療法では
根本的な解決が得られないばかりか
泥々沼々でしょう?
0031デフォルトの名無しさんNGNG
goto をループ抜ける目的以外で使ってる輩がパーです。
戻り方向に使ってるバカは N88BASIC を使って下さい。
あなたはどうですか? >>29
0032 NGNG
C++はすばらしいぞ!
オブジェクトとサブルーチンを分けてある。
ごっちゃにしてるほかのOOPより遥かに優秀!
0033デフォルトの名無しさんNGNG
>>31
gotoを状態遷移に使ってますがパーですか?
0034デフォルトの名無しさんNGNG
滅多に使わん機能ではないが、テンプレートの文法はダサいと思う。とくに
ネストした場合に vector<vecitr<int>> と書くと >> が演算子とみなされてエ
ラーになる仕様ね。

あとはヘッダと実装を二重に書くのも、面倒だよ。テンプレートを多用しだす
と、前方宣言を大量に入れる必要があって鬱。
003529じゃねえですけどNGNG
ループ抜ける以外にも、エラー処理をまとめたり、
状態遷移をハードコードするときには goto が欠かせません。
まさか while + switch で無理矢理代用するなんてしないよね。
0036 NGNG
>>31

同意。
ループ抜けるのにはよく使う。

規模にもよると思うが、
飛ぶ先がすぐ分からないのは却下。だとおもふ。
0037デフォルトの名無しさんNGNG
>>33 >>35
そのコードを見せて下されば幸いです。
0038デフォルトの名無しさんNGNG
continueとbreakで事足りること多いけどね。
gotoがいけないなんて事は無いけど。
0039デフォルトの名無しさんNGNG
幾重にもネストしているループを抜ける場合 goto はうれしいです。
004029NGNG
gotoを使ってはいけない理由を
「わかりにくくなるから」
以外に述べてください。
0041デフォルトの名無しさんNGNG
>>40
構造化やOOを切り裂くから。
0042デフォルトの名無しさんNGNG
>>41
breakやcontinueやreturnも使ってはいけないのですか?
0043デフォルトの名無しさんNGNG
C/C++に限らず,「構造化」とか言ってる人のコードって
異様にネストが深いことが多い。
004443じゃないよ。NGNG
>>43 確かに。よく理解できるなと感心する時がある。
0045デフォルトの名無しさんNGNG
>>37
簡単なので悪いけど /^[+-]?\d+$/ みたいなのを判定する関数
インデントは勘弁。

int
parse_int(const char* s, int* result)
{
int sign = 1;
int num = 0;

SIGN:
if (*s == '+') { s++; goto BODY; }
if (*s == '-') { s++; sign = -1; goto BODY; }
if (isdigit(*s)) { goto BODY; }
goto ERROR;
BODY:
if (isdigit(*s)) {
num = num * 10 + (*s - '0');
s++;
goto BODY;
}
if (*s == '\0') {
if (result)
*result = num * sign;
return 1;
}
ERROR:
return 0;
}
0046デフォルトの名無しさんNGNG
>>42
使ってもいいが駆使してはいけない。
0047デフォルトの名無しさんNGNG
結論:
gotoは悪くない。
gotoを下手に使うパーが悪い。
0048デフォルトの名無しさんNGNG
つか今時gotoについて語ること自体がおかしいと思う。
ネタ?
0049デフォルトの名無しさんNGNG
OOPができないうえに、そもそもマトモなコードを書けない人が、
わけのわからないコードを「構造化で書いてる」と言い訳する
見苦しい場面に、最近よくあいますが…
0050デフォルトの名無しさんNGNG
>>45

>BODY:
>if (isdigit(*s)) {
>num = num * 10 + (*s - '0');
>s++;
>goto BODY;
>}

何で for or while 使わないでわざわざ goto 使ってるの?
0051 NGNG
>>45
死ぬ。目が腐る。
0052 NGNG
>>45
コボラーかBasic臭のするコード・・。
0053デフォルトの名無しさんNGNG
>>45 ネタでしょ?突っ込む気もおこらん。
005445NGNG
キタナイものをお見せしてすみませんね(w
37 のリクエストに答えたまで。

特定の正規表現をハードコードしたイメージ。
なので元の正規表現がわかってれば読めます(たぶん)。

整数だと単純だからアレだけど、
例えば整数と浮動小数点数と文字列と全部判断するとなると
いわゆるキレイ+効率的には書けないでしょ。

実際にはマクロとかつかってもすこし見やすくなります。
ただし、C には見えなくなるかもしれんけど。
005545NGNG
>>50
goto で飛ぶのは、状態の遷移に対応してるので
ループにすると意味が通りにくくなります。

つーか、正直悪かった。
あやまるよ。
goto 使いはクズだよね!
0056 NGNG
SIGN:
ってなんなんだーゴルア
0057デフォルトの名無しさんNGNG
>>54
lex/yacc の吐くコードがこんな感じだよね。
自分で lexer 書くときは ERROR に飛ぶのだけ goto 使ってる。
0058デフォルトの名無しさんNGNG
「符号(=sign)を読むぜ」という状態

つーか、もういじめないで(w
0059デフォルトの名無しさんNGNG
>>57
lex だと汎用的すぎてでかくなるのがイヤな時は、
自分でこんな風にスキャナを書いて yacc と連係します。
初見のイメージほど読みにくくないよ。

だからいじめないで(w
0060デフォルトの名無しさんNGNG
>>54
むしろ、サンプルが「単純すぎた」のが敗因だと思うが。これだと goto は ERROR:
以外要らないし。

苛められすぎなんで、ちょっと弁護しておく。

状態遷移は色々書き方あるけど、最も高速に動作するのが手書きで goto 駆使し
たコード。状態を変数に入れて switch - case したり、関数ポインタを使って管理
するよりも速くなる。

処理系を書く場合、字句解析は性能を左右する部分なので、コードが汚くなろうが
気合入れて最適化する必要がある。そこで goto 使うのはアリだし、敢えて while
などを使わず、状態に対応するラベルを残しておいて、設計変更時に備えるのも
常套手段。


ま、俺は lex 使うけど(← ……
0061デフォルトの名無しさんNGNG
>>1
longjmp/setjmpは無いと困る
0062デフォルトの名無しさんNGNG
volatile使ったことない
0063デフォルトの名無しさんNGNG
終りか…
構造化原理主義者は根性無しばかりというわけだ。
アヒャヒャヒャヒャ次はなにしてあそぼかな。
0064デフォルトの名無しさんNGNG
C++ の protected 継承は使ったことないなぁ。
006545NGNG
ああっ、63 はオイラとは違うよ。(T_T)
0066デフォルトの名無しさんNGNG
>>62
制御系だと必須だが。周辺機器への入出力を特定のアドレスにマッピングしてる
ような場合、

int *p = (int *)0x00f0;
// read from I/O port
n = *p;
// again
n = *p;

これだと一度 0x00f0 番地から読み出したデータをレジスタに格納しておいて、
使いまわされる恐れがある。

あとは setjmp(), longjmp() が絡む場合も volatile にしておかないとローカル変数
がレジスタに割り当てられて泣けるぞ。
0067 NGNG
>>60
まあ、GOTOはともかく状態遷移は理解できます。
同じ層で状態遷移しなきゃならないのに、サブルーチン作っちゃって
他の処理へ飛ぼうとして立ち往生する奴いたもので。
0068デフォルトの名無しさんNGNG
C++ の話。
なんていうか、private な部分の宣言がヘッダに見えちゃうのが嫌いだな。
外部に無関係なはずのに、さわったら全部コンパイルしなおしってのが。
効率/実装上いたしかたないという気持わわかるんだけれども。
0069デフォルトの名無しさんNGNG
>>68
そんなあなたに Bridge パターン。Win32 なら COM もアリ。

言語レベルで対処してくれれば嬉しかったのに、というのは同意だが。
0070デフォルトの名無しさんNGNG
#define private public
0071デフォルトの名無しさんNGNG
↑
そういう話じゃないってば(藁
0072デフォルトの名無しさんNGNG
>>69
単に、実装クラスに委譲するラッパー書けばいいだけだよね?
0073ラッパーって??NGNG
三木道三 とか?
007469NGNG
>>72
その通りでございます。
007568NGNG
ま、そう言ってしまえばそれまでだね。(笑
0076デフォルトの名無しさんNGNG
こういうこと。HogeImplのソース/ヘッダを公開する必要は
無いので、HogeImplの実装を隠蔽できます。

>>>>ランタイムにして隠すクラスのヘッダ
class HogeImpl{
private int hoge;
public int getHoge(){return hoge;}
public void setHoge(int val){hoge = val;}
}
>>>>>

>>>>>公開するヘッダ
class HogeWrapper{
private HogeImpl impl;
public int getHoge();
public void setHoge(int val);
}
>>>>
0077デフォルトの名無しさんNGNG
>>66
なんで組み込みの人って
IOポートアクセスみたいな特殊な処理を
さらりと代入文で書いちゃうの?
C++なら
inline int inport(int port) { return *((volatile int *)port); }
int main() {
int port = 0x00f0;
// read from I/O port
n = inport(port);
// again
n = inport(port);
}
とした方がOS変える時とか変更箇所が少なくて良いと思うんだけど
あ、volatileが必要ってのはそりゃそうなんだけど。
0078デフォルトの名無しさんNGNG
mutable
0079デフォルトの名無しさんNGNG
union
0080デフォルトの名無しさんNGNG
参照かポインタ
とっちか片方にしてくれ
0081デフォルトの名無しさんNGNG
>>77
>66 のはメモリマップドI/Oだから。
あなたのはI/OマップドI/Oだから inport, outport などの関数を
使うのです。
008266NGNG
>>81
微妙に勘違いしてるぞ。>>77 は inport() も自前で定義してる。

>>77
あのコードは単に volatile 使う一例として書いたから。実際には 0x00f0 なんて
マジックナンバーはコードに埋め込まないし、抽象化もします。
0083デフォルトの名無しさんNGNG
>>81
いや、メモリマップドI/Oだからって普通のメモリ(?)
と同じ風にアクセスするのはやめようよって言ってるんだけど。
>>77はメモリマップドI/O用に書いたんだよ。
関数inport()という名前が悪かった(I/Oマップド用に見える)
というならメンゴ

けど、>>77みたいに書いてれば、
たとえば、メモリマップドのMIPS用に書かれた関数を
I/Oマップドのx86用に書き直すときに簡単になるとか、
I/Oアクセスタイミングが分かり易くなるとかメリット多いでしょ?
0084デフォルトの名無しさんNGNG
Placement newってどんな時使うんですか?
0085デフォルトの名無しさんNGNG
任意の場所をコンストラクタに初期化させたい時
0086デフォルトの名無しさんNGNG
コンパイルの遅さ=時間の無駄
時は金なり。
0087デフォルトの名無しさんNGNG
>>86
けっこう同意(w
0088デフォルトの名無しさんNGNG
>>45
それ、ERROR:以下にエラー処理ないやんか…
0089デフォルトの名無しさんNGNG
>>86
コンパイル遅いって、何と比較してるの?

昔は切実だったが、最近だと大きめのプロジェクトでもプリコンパイルヘッダ/インクリ
メンタルリンクを使えば数分で終わるから、もはや気にしなくなったが。
0090デフォルトの名無しさんNGNG
>>89
Delphi
0091デフォルトの名無しさんNGNG
>>90
Del 使いが C/C++ スレッドに来ると、スレチガイの書き込みを繰り返して荒れる
のが常。早めにお帰り願いたい。
0092デフォルトの名無しさんNGNG
>>89
VC使ってIDEのエディタで変数名や関数名とかの定義位置を
探すときにいちいちコンパイルするでしょ。あれが長ったらしくていやなんだよね。
0093デフォルトの名無しさんNGNG
>>88
エラー処理じゃなくて ERROR という状態なんだってば。
自分のアフォさをさらけだすだけだからもうよせって。
0094デフォルトの名無しさんNGNG
DelのPersonalをダウンロードして、サンプルをいくつかコンパイル
してみたけど、噂ほどは早くないって印象だけど。
0095デフォルトの名無しさんNGNG
>>94
そんなことはないだろう。
たいてい数秒以下で終わるぞ。DelPro だけど。
マシンの Mem が 32MB とかないよなー。
0096デフォルトの名無しさんNGNG
速いとか遅いとか言っても、ほんの数秒の話だしね……
0097デフォルトの名無しさんNGNG
C++のasm宣言
0098デフォルトの名無しさんNGNG
>>97
asm って言語仕様にないだろう。特定の処理系の話になるんじゃないか。
まーそうは言ってもたいてい asm 使えるけど。
0099デフォルトの名無しさんNGNG
>>83
x86の経験しかない厨房的質問でスマソ
使った事があるMMIOを提供しているボードは皆書き込んだ後にoutpを
要求しているんだけどこれって少数派?
#outport()で*ptrとoutp()を両立できないよね?って云ってますです

それとドライバを書く時に他CPUへの移植性なんて意識しちゃいないん
だけど、皆普通に考えてるもんなの?

微妙にスレ違いな気がするのでsage
0100デフォルトの名無しさんNGNG
ひゃく
0101デフォルトの名無しさんNGNG
reinterpret_cast の使い道が良く分からないです
単なるキャストとちがうのですか?
0102デフォルトの名無しさんNGNG
このへん
http://piza2.2ch.net/test/read.cgi/tech/996640937/190-195
0103デフォルトの名無しさんNGNG
valarray
0104デフォルトの名無しさんNGNG
io/fstream
0105101NGNG
>>102
ありがとうございます
明示的にキャスト変換を呼ばない(でいいのかな)んですね。
疑問が解けました。なかなかの曲者ですね。
0106デフォルトの名無しさんNGNG
>>95
確かにDelのコンパイルは激速。
もちろん差分コンパイルは一瞬なのは言わずもがなだが、
手元の6万行くらいのコードを再構築(PenIII700MHz)してみたところかかった時間は5秒・・・。
思わず笑ってしまった。

昔はマシンスペックがあがればgccもVCのコンパイラもストレスなく使えると
思っていたがそうでなかったので少々がっかり。
0107 NGNG

コンパイルが遅いというか、
中間ファイルがデカい気がするのですが、
気のせい?>VC
0108デフォルトの名無しさんNGNG
>>106
pascalはLL(1)文法で定義されているから速いのは当然
ただ、Delphiの文法もLL(1)文法かは知らない。

C言語はLR(1)(LALR)文法だから遅い。
0109デフォルトの名無しさんNGNG
というかヘッダがテキスト取り込みなのが遅い原因と思うが…
あと#defineを置換して回るのも遅そうだ
0110デフォルトの名無しさんNGNG
printf()でおなじみの「可変長引数」って実装したことないや。
なんであれがコンパイル通るんだろ。不思議でたまらん。
va_listマクロなんかは特別扱いされてんのかな?
0111デフォルトの名無しさんNGNG
>>110

使ったことあるよ。
stdarg.hだっけ?

CVSの読み込みに%d,%s,%fみたいに読めるようにした。
0112デフォルトの名無しさんNGNG
>>109
バカこけ。自分でテキスト置換プログラム書いてみろよ。
どんななアホが書いたって一瞬で終わるよ。
0113デフォルトの名無しさんNGNG
I/Oアクセスは関数書いて抽象化出来るならそれに越した事ないけど
 速度的に出来ない場合も多いし
 関数内部じゃ結局 volatile 必用になる場合多いよね
 といっても最後はインラインアセンブラになっててvolatile 使わない事になるけど
0114デフォルトの名無しさんNGNG
>>112
> どんななアホが書いたって一瞬で終わるよ。
お前もcppを書いてみてからそーゆー大口を叩け。
0115デフォルトの名無しさんNGNG
>>114
正直、ありったけのインクルードファイルを読み込んでも、
そんなに重くならない気がする。
(内部で何してるかは知らないので、何ともいえないが。)
0116デフォルトの名無しさんNGNG
>>108
Cも再帰下降でかけなかったっけ?
つまりLL(1)
0117デフォルトの名無しさんNGNG
>>108
それと、Pascalのパースが速い理由は1パスだからで、
文法は関係無い。
0118デフォルトの名無しさんNGNG
>>116
一カ所だけかけない部分があります。考えてみそ。
0119デフォルトの名無しさんNGNG
if elseのネストってんでしょ
0120デフォルトの名無しさんNGNG
>>118
ケッ、エラソーニ
0121109NGNG
>> 112
うーむ、結構速く済むな。
でもDelphiなら同じ時間でコンパイルまで終わっちまいそうだが。
>> 119
Pascalのifもelseの前にセミコロンがあるかないかでCと同じ。勿論ネスト可能。
ということで違う気がする。
キャストかな。再帰下降なら(int*)Aとかで"("がキャストの括弧なのか
優先の括弧なのか区別がつかなさそう。
0122デフォルトの名無しさんNGNG
>>116
純粋に LL(1) じゃないけど、だいたい再帰下降でパースできます。Dennis
謹製の初期 C コンパイラに関するドキュメントとソースコード。

http://cm.bell-labs.com/cm/cs/who/dmr/primevalC.html

そもそも最初の C コンパイラが世に出たときって、まだ LALR 用のコン
パイラジェネレータ存在してなかったから LALR ってことは、ありえない
でしょ。手作業で LALR 状態遷移表を計算するのは無謀だから、コンパ
イラジェネレータ無しだとやってられんし。

>>118
ほんとに一箇所?
0123デフォルトの名無しさんNGNG
118はあふぉですので
0124デフォルトの名無しさんNGNG
>> 108=118?
で、答えは?
0125デフォルトの名無しさんNGNG
>>115
ありったけのインクルードファイルをインクルードしてみた。
86万行。
0126デフォルトの名無しさんNGNG
VC++はプリコンパイル済みヘッダーという機能があります
これを使うと、ほとんど書き換わらないヘッダファイルが何万行あっても
遅くならないです

windows.hがデカイ遅いとお悩みの方は利用を検討してみては。
あと、gccに導入されないのが不思議。

スレ違いっぽいのでsage
0127デフォルトの名無しさんNGNG
だから、108はあふぉですよ
0128デフォルトの名無しさんNGNG
なんといっても、一番うっとおしいのはアロー演算子( -> )やな。
ドット( . )にしとけや!!!
C#では廃止されたけどな。
0129デフォルトの名無しさんNGNG
>>128
ハァ?
0130デフォルトの名無しさんNGNG
>>128
激しく同意!
0131デフォルトの名無しさんNGNG
128 はアフォということで。
0132デフォルトの名無しさんNGNG
>>128や>>130はまともにC/C++が使える人間ならば出ない発言だと思うが…
0133デフォルトの名無しさんNGNG
>>129や>>131-132はまともにC/C++が使える人間ならば出ない発言だと思うが…
0134デフォルトの名無しさんNGNG
暴れているのはJava厨房かな?
0135デフォルトの名無しさんNGNG
>>132
禿同

>>133 は実体・参照・ポインタの区別の付かないJava厨房と思われ。
0136デフォルトの名無しさんNGNG
Java厨は悲しいね。
理解できないのは言語仕様のせいですか。
0137デフォルトの名無しさんNGNG
確かに -> の機能を . に置き換えても文法的に問題なさそう。
Cとの互換性以外は。

C++が言語仕様を複雑にしてるのは他人に自慢するため?
実体・参照・ポインタを区別して良いことある?
ほんとにその仕様はリーズナブル?
0138デフォルトの名無しさんNGNG
>>137
GCがない分、stackに置いたobjectがスコープはずれて
自動でデストラクトされるのは非常に重要なんすが。
0139sageNGNG
>>137
->と.は別に一緒でもいいと思うが、
参照とポインタが明確に区別されているからこそ、
低水準なプログラムもスマートに書けるようになるんだよ。

C++は高級言語ではないってこと、忘れてないか?
0140デフォルトの名無しさんNGNG
>>139
C++ に限って言えば operator->() 使えないと、スマートポインタを実装するのに
困らない?
0141デフォルトの名無しさんNGNG
>>137
> 確かに -> の機能を . に置き換えても文法的に問題なさそう。
文法勉強してから出直してこい
0142デフォルトの名無しさんNGNG
>>137
マジで言ってんのかよ・・・
コンパイラコンパイラの本でも読んで、本当に問題が無いか考え直してくれ。
0143デフォルトの名無しさんNGNG
>>142
つ−か137はJavaと同様にせよっていってるんじゃないの?
Java厨だね。
0144デフォルトの名無しさんNGNG
>>138
それはわかる、けど3種類いらないでしょ。
実体とポインタで十分でしょ?

>>139
わかんない。参照あるとswapがかけるとか?

>>140
operator.()オーバロードできるようにしちゃえ
0145デフォルトの名無しさんNGNG
Javaも十分複雑だとおもいます。
packageでのアクセス制限とか
コンストラクタでの仮想関数の挙動だとか
synchronizedの扱いが実は難しいとか
初心者泣かせで、かつ、実装ミスを誘発やデバグを困難にする原因になっていますね。
Java厨というのはそういうところまで使い込んでないんですよね。
0146デフォルトの名無しさんNGNG
オブジェクトの実体参照は必要なし。すべてポインタを介してアクセスすればよい。
現にボーランドの言語製品はそうしてる。
0147138NGNG
>>144
つまり、参照とポインタの両方あるのは何故?どうして?
っていう典型的な議論に帰結するわけね。
もう語り尽くされているからどうでもいい。
0148デフォルトの名無しさんNGNG
Del厨まで登場かよ!
0149デフォルトの名無しさんNGNG
わたしはJava厨房ではありません。Delphi厨房です。
0150デフォルトの名無しさんNGNG
C++Builder のソース見てみろ。アロー演算子だらけだぞ。
0151デフォルトの名無しさんNGNG
>>145
> packageでのアクセス制限とか
そうかな?暗黙なのがやなのか?

> コンストラクタでの仮想関数の挙動だとか
これはC++の方が決まってないことが多いだけで、
挙動がはっきりしてるJavaは分かり易いかと

> synchronizedの扱いが実は難しいとか
マルチスレッドはどの世界でも難しいんであって
言語レベルで取り込んでしまったからしょうがない。
けど、もうちょっと分かり易い実装でも好かったかも

っていうかなんでJavaを出したがる?
0152デフォルトの名無しさんNGNG
JavaでOOPできてるPGはあまり見ないねー
C++プログラマーの3%はOOPができるみたいだねー
科学者のJavaプログラムはすごくきれいで読みやすいねー
C++でOOPを勘違いしてると、ある意味突っ込めない(w
実行時ポリモーフィズム使いずらいって,C++
0153デフォルトの名無しさんNGNG
>>142
-> を . をまとめるって言ってる人は、

a.b

というコードが出てきたとき、a の型によって . の意味を変えようといってる
わけだよね(ちょうど [] に対するアセンブラ出力が、変数の型によって異な
るように)。

これは既存の文法と衝突せずに実装できそうな気がするんですが、パー
ズ不可能になるコードの実例を挙げられる人はいます?

>>144
operator.() をオーバーロードしたら、auto_ptr 自体のメソッドと auto_ptr に
格納されているオブジェクトのメソッドを区別できませんがな。

std::auto_ptr<foo> p;
p.reset(); // この reset() は auto_ptr<foo>::reset(), それとも foo::method() ?
0154デフォルトの名無しさんNGNG
>>147
結論は?URLプリーズ
0155デフォルトの名無しさんNGNG
>>152
意味不明な上に、スレ違い。

「C/C++のこの機能逝って良し」に関係ない話題は yoso でやってくれ。
0156デフォルトの名無しさんNGNG
Java はオブジェクト指向を徹底しすぎて逆に使いにくい部分がある。
グローバルな関数を作りたい時もあるんだよ。
0157デフォルトの名無しさんNGNG
>>152
ソースを示せ。つーかPGって何だよ。ペログリしかおもいつかねえ。

>>138
そうだな。std::stringをnewしねえと駄目なんじゃ、Cとかわらん(藁
悪夢だ。
0158デフォルトの名無しさんNGNG
>>156
定数一つ宣言するのも、オブジェクトのメンバにしないといけないし。
0159デフォルトの名無しさんNGNG
>>156
ハァ?つくれるじゃん。staticなメソッドに我慢がならない
のか?C厨は名前空間(一般名詞)の概念も理解できないのかね。
0160デフォルトの名無しさんNGNG
>>158
s/オブジェクト/クラス/ だね。

C++ でコード書くときにも、定数やグローバル関数は namespace 切るから、
手間は大差ないと思うが。
0161デフォルトの名無しさんNGNG
とりあえず、Java知らないやつが結構多いよね
C++でできるオブジェクト指向って・・・
0162デフォルトの名無しさんNGNG
>>161
具体的に C++ の機能を批判するのではなく感想文を書きたいだけなら、
逝ってくれ。
0163デフォルトの名無しさんNGNG
じゃぁ話題を。
C99のこの機能逝ってよし!を誰か提供してくれ。読みたい。
0164デフォルトの名無しさんNGNG
>>153
> std::auto_ptr<foo> p;
> p.reset(); // この reset() は auto_ptr<foo>::reset(), それとも foo::method() ?
.をオーバーロードした人はpublicなメソッドを持つのは諦める。
auto_ptr<foo>::reset(p)

あるいは他の単項演算子でアクセサクラスを返すようにして、
(*p).reset()
とか
0165デフォルトの名無しさんNGNG
VB厨房も仲間に入れてください…
0166デフォルトの名無しさんNGNG
駄目>165
0167デフォルトの名無しさんNGNG
>>163
とりあえず、リンク張っとくか。

プログラミング言語 C の新機能
http://www.geocities.co.jp/SiliconValley/1002/c99d/

個人的には bool ではなく _Bool ってのがショックだったが。
0168デフォルトの名無しさんNGNG
機能拡張して良くなってんのか?
可能性は広がるとしても、複雑化するのは止めてほしい!
0169デフォルトの名無しさんNGNG
>>167
多重継承できないクラス逝ってよし
と思ったけど無かった。保守的な規格だったのね。
0170デフォルトの名無しさんNGNG
VCで採用されなきゃ意味無し。 >C99
0171デフォルトの名無しさんNGNG
>>170
VC++でC言語でプログラム書くような人たちって存在するの?
俺はUNIX屋だからよくわからんのだが。
0172デフォルトの名無しさんNGNG
>>171
まあ、極稀に。
普通はC++だろうなぁ。
0173デフォルトの名無しさんNGNG
class使わなければCとたいしてかわらん。
0174デフォルトの名無しさんNGNG
>>170
C99 も gcc あたりで実装してくれると嬉しい人は多いと思うが。

VC++ には、C99 はどうでも良いから、むしろ早く ANSI C++ に準拠して template
まわりのバグをつぶして欲しい。
0175153NGNG
結局 >>142-143 は勘違いだったってことで、ファイナルアンサー?
0176sageNGNG
>>171
UNIXみたいなとこにポートすることを前提にしてる場合は有り。
0177sageNGNG
>>140
困るね。気づかなかったすまん
0178デフォルトの名無しさんNGNG
C++の強化版がC#ということでいいですか?みなさん。
0179デフォルトの名無しさんNGNG
C#できればC++しなくていいのなら
C#マンセー
0180デフォルトの名無しさんNGNG
>>178 かなり良くはなっているけど、
MSが提供する既存APIの呪縛からは逃れられないのかね〜?
0181デフォルトの名無しさんNGNG
C#では基本的にWindowsAPIを直接コールすることはしない(やろうと思えば出きるが)
すべてCLRのライブラリを介して行うのだ。
0182デフォルトの名無しさんNGNG
.と->の話題が気になって追いかけてたんだけど、>>153へのレスはないの?>.と->両方要る派の人
0183デフォルトの名無しさんNGNG
>>181
だったらjavaでいいじゃん。
0184デフォルトの名無しさんNGNG
javaってjavaしか(シームレスには)使えないっていうのがもう時代遅れの感があるね。
開発者の頭もカタくなってしまうし、周りが見えなくなるし、javaは弊害が多いね。
0185デフォルトの名無しさんNGNG
MSはJavaの名前を使えなくなったから新しい言語を作ったのだ。C#=Java + ObjectPascal + C++
0186デフォルトの名無しさんNGNG
>>185
VBが入っていないYO!
0187デフォルトの名無しさんNGNG
>>185
っていうか C# = VJ++ + Delphi + VC++
0188デフォルトの名無しさんNGNG
C#にはCも入ってる?(ANSIライブラリ)
0189デフォルトの名無しさんNGNG
奥までくわえてもらうとすごくいいです。
0190189NGNG
すみません。スレ違いでした。
0191デフォルトの名無しさんNGNG
んー、でも意味は通るな 藁
0192デフォルトの名無しさんNGNG
>>188
入ってない。
0193デフォルトの名無しさんNGNG
っていうか、C/C++以外の言語逝ってよし。
Del厨やVB厨やshigeがこの世から消えるからな。
0194 NGNG
>>193
C#はどうなるよ?
逝っていいの?
(あえて二行目には突っ込まない(w
0195デフォルトの名無しさんNGNG
>>194
C#は存在していてもまだ実務で使われるレベルのものじゃない(製品が無い
それから、システムを記述できる万能言語でもないから、無くてもいい
C/C++があれば事足りる。
0196デフォルトの名無しさんNGNG
アセンブラとCとC++以外は消えて無くなるような予感・・・。
0197デフォルトの名無しさんNGNG
キミが消えてなくなるような予感・・(藁
0198デフォルトの名無しさんNGNG
>>196
普通にBasicも生き残るダロ。
使<s>え</s>わないけど(;´Д`)
0199デフォルトの名無しさんNGNG
-> を . に置き換えるというと、
(*p).a みたいにするって事?
p[i].a ならよく使うよ。
0200デフォルトの名無しさんNGNG
VCで
ifstream f1(argv[1], ios::in | ios::);
つかえねーじゃんか!!
0201デフォルトの名無しさんNGNG
C/C++にもlispの内部定義(+無名関数)とか入れて欲しいなあ。
多分、文法上は関数定義が置ける以外は何も変わらないと思う。
そういうプリプロセッサでもあったらいいんだけど。
0202デフォルトの名無しさんNGNG
つうかC++は機能拡張よりもシンプルになるべき!
あっそれがC#やjavaか・・・。
0203デフォルトの名無しさんNGNG
>>201
ローカル関数みたいの?
そんで inline 展開されたりすると素敵。

>>202
C/C++ と C#/Java 系は字面的にちょっと似せてあるだけで
方向性が全然違うと思う。単純に比較するのもどうかと思う。
0204デフォルトの名無しさんNGNG
>>201
nested functionならgccの拡張にあるねぇ
foo (double a, double b) {
double square (double z) { return z * z; }
return square (a) + square (b);
}
無名関数/無名クラスは欲しいなぁ
STLと食い合わせてみたい

やっぱ、C/C++は臨床実験言語として
いろんな機能を取り込んでってほしいかな。
漏れは普段使わないから
0205デフォルトの名無しさんNGNG
>>203
ローカル関数なら、関数の中でクラスを宣言してstaticなクラス関数を書けば、
それがローカル関数にならなくもない。in C++。こんなかんじ。

void test{
class FUNC{
public:
static void function(){ printf("test");};
};
FUNC::function();
}

コールバック書くときとかに時々使える。あんまりつかうとソースが汚くなる。
0206203NGNG
わかってると思うけど、
可能なのとサポートされてるのは違うじゃん。
0207デフォルトの名無しさんNGNG
>>203
方向性として

C++ は豊富な言語仕様/効率性重視
C#/Java はシンプルな言語使用に豊富なライブラリ/仮想マシンによる抽象化

と、ぜんぜん違うと思う。
0208デフォルトの名無しさんNGNG
>>205
char v[] = {...};
qsort(v. sizeof(v), sizeof(v[0]), int __cdecl lambda(const void* e1, const void* e2) { return *(char*)e1 - *(char*)e2; });
0209デフォルトの名無しさんNGNG
ちなみに、そういうプリプロセッサ何年か前に書いたことあったけど、
使わなかったから消したと思う
0210デフォルトの名無しさんNGNG
>>208
おお、なるほど。俺はついインラインアセンブラで書いちゃう(w
0211デフォルトの名無しさんNGNG
実行効率 java < C/C++
開発効率 java > C/C++
0212デフォルトの名無しさんNGNG
>>211
物によるダロ>開発効率
0213デフォルトの名無しさんNGNG
>>212

Hello World の開発効率はどっちが有利でしょう?
0214デフォルトの名無しさんNGNG
hugeポインタ最近使った?
0215デフォルトの名無しさんNGNG
暗黙の型変換逝ってよし,という漏れは潔癖厨房ですか?
0216デフォルトの名無しさんNGNG
んー、組み込み型間の暗黙の変換は必要だろうなぁ。これを否定しちゃうと
ちょっと厨房カモ。

でもユーザー定義型を含む暗黙の型変換は、極力使うべきではないってのが、
最近の流れじゃないんですか?どうなんでしょう。
0217デフォルトの名無しさんNGNG
explicitじゃなくてimplicitキーワードを導入すれば良かったのにねぇ。
なんかFortranを思い出すな。
0218デフォルトの名無しさん NGNG
>>216
integral <-> pointerも許すの?
subtype関係にないtype間の暗黙の型変換は有害だよ。
0219デフォルトの名無しさんNGNG
>>213
JavaよりC++Builderのほうが上。
0220デフォルトの名無しさんNGNG
>>217
> explicitじゃなくてimplicitキーワードを導入すれば良かったのにねぇ。
explicitは明示しろってことだろう。
0221デフォルトの名無しさんNGNG
>>220
暗黙の型変換を行うのがデフォルトではなくて、
implicitで明示しない限り型変換できないようにすべきということだろ?
0222デフォルトの名無しさんNGNG
> 暗黙の型変換を行うのがデフォルトではなくて、
> implicitで明示しない限り型変換できないようにすべきということだろ?

暗黙にするときは明示しろ!ってなんかすごいね
0223デフォルトの名無しさんNGNG
つーかimplicitなんか導入した日にゃ、
今までのコードがコンパイルできなくなるんだが?
0224216NGNG
>>218
あれ、integerとポインタ間って暗黙変換できましたっけ?
C++では少なくともワーニング出ると思うんだけど。

最近Javaばっかりだから記憶があいまいだ...
0225216NGNG
あー、スマソ。オレの「組み込み型間の暗黙の変換は必要だろうなぁ」から
「integerとポインタも組み込み型だから、暗黙の変換は必要だ」と解釈した
わけね。

前言撤回。「C++で許される組み込み型間の暗黙の変換は必要」に改めます。
0226デフォルトの名無しさんNGNG
>>223
クラス定義の最初にimplicit none; と書くのさ。
Fortran77に習って。
あとimplicit virtual;で暗黙的に仮想関数になる機能とか。
文法ぐっちゃぐちゃ。
0227デフォルトの名無しさんNGNG
>>213
だから〜
何でやるんだYO?

メッセージボックス一個とかよ?
それとも単にprintfちっくにやるだけでいいのかよ?
それともウィンドウ作らないときがすまないのかよ?

わかんね〜YO
0228デフォルトの名無しさんNGNG
>>224
> あれ、integerとポインタ間って暗黙変換できましたっけ?
> C++では少なくともワーニング出ると思うんだけど。

Warningってのは、lint++の機能をcompilerが持ったというだけで、C++の仕様とは違うだろ。
integral <-暗黙型変換-> pointerは、0がnull pointerと同時に逝ってよし大賞。

>>225
subtype関係にあるclass同士はどうするんだー?明示なのか?
0229デフォルトの名無しさんNGNG
>>228
C++では0をNULLの変わりに使わないか?
void*からの変換でwarning出るし
0230216NGNG
>>228
integerとpointerは暗黙変換できませんでした。最初から確認すればよかったね。
具体的にはVC++6.0では以下の文はそれぞれエラー(C2440)でした。
char *p = 0x10000;
int n = p;

0リテラルがnull pointerっつーのは、Cとの互換を考えると仕方ないとも思うけど、
言語仕様としては望ましくないと思うね。

subtype関係にあるclass同士ってのは、どういうこと?以下のクラスがある時に
class Foo {..};
class Goo: public Foo {...};

Foo f = Goo(..); のとき?これはトラブルの元になりやすいから、暗黙変換を禁止
していいんじゃないかなぁ。

Foo *p = new Goo(..); は 「Goo型へのポインタ」という組み込み型から「Foo型への
ポインタ」という組み込み型への変換だよね。で、C++では許されている暗黙変換なので、
これはOKだと思う。参照も同じだよね。
0231デフォルトの名無しさんNGNG
>>228
どうでもいいが、本気で整数型を integral だと思ってる?
0232228じゃないがNGNG
integral は「整数の」という意味の形容詞だが、なにか問題でも?
(「積分の」という意味と無理やり混乱したいとでも??)
0233デフォルトの名無しさんNGNG
>>231
> どうでもいいが、本気で整数型を integral だと思ってる?

すまん、疑問形で投げかけられても、意味が分からん。明確に話してくれ。
”Integral type”ってのは、翻訳本だと、

論理型、文字型、整数型は整数系データ型: integral typeと総称され、

のことだ。Cの頃からの用語。

>>230
ああ、参照は組み込み型だっけ…(今、自宅なので規格書がない)
0234231NGNG
>>232-233
なるほど。勉強になったよ。
0235デフォルトの名無しさんNGNG
>>234 素直で(・∀・)イイ!!
0236デフォルトの名無しさんNGNG
教養のために一言
integerの読みはインティジャーです。
あなたはインテガーとか逝っていませんか?
0237デフォルトの名無しさんNGNG
>>236
超合金ロボみたいだ、インテガー
0238デフォルトの名無しさんNGNG
>>205
>ローカル関数なら、関数の中でクラスを宣言してstaticなクラス関数を書けば、
>それがローカル関数にならなくもない。in C++。こんなかんじ。

でも、その関数内クラスってテンプレートに使うとかーちゃんに怒られるんだ
よなぁ。言語仕様的にもダメなのかは知らんけど。STLマンセーな俺的にはちょ
っと不便。

下がってきたので保守age
0239デフォルトの名無しさんNGNG
>>238
俺もだ。VC++特有かな?
言語仕様かな?

むしろlambda classきぼーん。
gccには拡張構文であるんだっけ?
0240デフォルトの名無しさんNGNG
>>239
テンプレートの中身にはローカルな型は使えないぞゴルァ!って怒られるんだっけね。
0241名無しさんNGNG
俺は
おまえの
フレンドだ
0242デフォルトの名無しさんNGNG
俺の物は俺の物。
お前の物は俺の物。
0243デフォルトの名無しさんNGNG
↑ジャイアン発見
0244デフォルトの名無しさんNGNG
↑Yahoo発見
0245デフォルトの名無しさんNGNG
↑Geocityesかよ
0246デフォルトの名無しさんNGNG
↑Geocitiesだろ。ネタじゃないよね?(プププ
0247デフォルトの名無しさんNGNG
>>246 シマッタ。外資で働いてるのに。鬱で氏んで来る。
0248デフォルトの名無しさんNGNG
ttp://www.sptopix.com/icp/5333/japanese/5333top_j.html
ココ?>>247
0249デフォルトの名無しさんNGNG
274>>248 座布団やるよ。俺の遺品だけど取っといてくれ。

       ||
     Λ||Λ
    ( / ⌒ヽ
     | |   |
     ∪ / ノ
      | ||
      ∪∪
0250デフォルトの名無しさんNGNG
- プリプロセッサ

 馬鹿が気取ってマクロ書いたり、勝手な#if~#endif入れたり、
 使いもしないヘッダを#includeするから、糞みたいに汚くなるし、
 ちょっと改修でバグることバグること。

- no breakがデフォルトのcase分岐

 普通はよく使うパタンをデフォルトにするだろ。
 スルーするコードもありはするけど、大概、設計が甘いだけ。
0251デフォルトの名無しさんNGNG
no breakをデフォにするなら、caseの自由度を上げて欲しいなぁ。
せめて範囲指定が欲しい。
case 'A' to 'Z': みたいな感じ(この表記は問題あるが)
0252デフォルトの名無しさんNGNG
override キーワード導入希望。
仮想関数オーバーライドするときに
名前間違えてもそのまま通ってあとで鬱。
0253遅レスですがNGNG
116>>Cも再帰下降でかけなかったっけ?
>>つまりLL(1)
118>一カ所だけかけない部分があります。考えてみそ。

ひょっとして、ラベル文(識別子 + ':')の所ですか?
識別子を先読みしただけでは、次にコロンが来てラベルの定義になるのか、
そうではなくて式の変数の参照になるのかわからないので、
さらにコロンがあるかどうか先読みする、という。

たしか、昔、elks(どうなったんでしょうか?)の開発環境に付いていた
ブルースエバンズ(著名な方のようですがスペルを忘れました)のCコンパイラ(再帰下降法)の
ソースを覗いてみたら、そういうふうになっていたような気が、、、。
違ってたらごめんなさい。
0254横槍NGNG
>>253 if,elseでは?
ifがネストしていた場合elseがどのifに対応づけられるのか
LL(1)だと決定不能なんじゃなかったっけか?
で、特例ルールとしてelseは直近のifに対応づけられるってのが
付け加わっている と。
0255デフォルトの名無しさんNGNG
>>254
C じゃなくて Pascal 風だけど、直感的な構文規則の書き方

stmt -> IF expr THEN stmt | IF expr THEN stmt ELSE stmt | other

だと文法自体が曖昧になってしまう(とうぜん LL(1) でもない)。ただし、これを
曖昧でないように書き換えることは可能。で、それって、他の規則によっては
LL(1) で書けたんじゃないかなあ。

if - else に関しては、現実問題として構文規則を機械的に書き換えるより「最
近傍の if にくっつく」と文法を定義した方が構文規則を作るのもパーサーを作
るのも楽だから、そうしてるだけだったかと。

(間違ってたら指摘してくれ)
0256デフォルトの名無しさんNGNG
>>118
答えは?
0257デフォルトの名無しさんNGNG
>>255
Java だと「最近傍の else につく」という特例を使わず、構文規則の方で定義
してるね。おかげで StatementNoShortIf とか、よけいな非終端記号が増えて
て直感的に何言ってるのか分かりづらい。
0258デフォルトの名無しさんNGNG
キーワード増え過ぎ逝ってよし
0259デフォルトの名無しさんNGNG
>>258
typenameとかexplicitとか見てると末期状態だよね。

C++で最も逝って良しなのは、その規格を完全に満たすコンパイラがこの世にまだ存在していない(らしい)ことかな。
0260デフォルトの名無しさんNGNG
>>259
俺は逆に static の使いまわしの方が鬱だ。キーワードは分けてくれた方が嬉しい。
0261デフォルトの名無しさんNGNG
関数のstaticと変数のstaticは意味が全然違うしなぁ
0262Kusakabe YouichiNGNG
In article >>261, 261 デフォルトの名無しさん wrote:

> 関数のstaticと変数のstaticは意味が全然違うしなぁ

どう違うのですか?
関数の外にある変数の場合で説明してください。
0263デフォルトの名無しさんNGNG
>>261
クラスメソッドの static に至っては、もう何がなんだか。
0264デフォルトの名無しさんNGNG
>>6

infinity{

}
0265デフォルトの名無しさんNGNG
>>251
gcc の独自拡張だと
case 'a' ... 'z':
みたいな書き方ができるんだけどねぇ。
0266デフォルトの名無しさんNGNG
>>264
#define ever (;;)

for ever {
}
0267デフォルトの名無しさんNGNG
#define infinity for(;;)

infinity{

}
0268デフォルトの名無しさんNGNG
#define mugenruupu for(;;)

mugenruupu{

}
0269デフォルトの名無しさんNGNG
>>262

(1) ローカル変数に対して static を使うと
 その関数を抜けても値が保持されたままの変数になる
 (関数内からだけ参照できるグローバル変数みたいな感じ)

(2) グローバル変数および関数に static を使うと
 そのファイル内からだけ参照できる変数になる

(3) クラスのメンバに対して static を使うと
 いわゆるクラスメンバというやつになる
 (インスタンス名.XXX じゃなくて、 クラス名::XXX で参照するやつ)

特にややこしいのが、

// aaa.h
class AAA
{
public:
 static int a; // (3) の意味の static
};

// aaa.cpp
#include"aaa.h"
static int AAA::a = 0; // (2) の意味の static
//↑ こいつに static を付けると変なことになる
// クラスの public 変数なのに、aaa.cpp の内部でしか使えないから。
0270デフォルトの名無しさんNGNG
>>269
static が

- 変数/関数のスコープ(別の翻訳単位から参照できるか?)
- 変数の寿命(スコープを抜けると値が失われるのか?)
- インスタンスと関連付けられるか

と、全然違う意味を持ってるのがナニだよね。Java も static の多義性は
引き継いじゃったけど。
0271デフォルトの名無しさんNGNG
>>269
数年前に作ったプログラムのバグ(とは言えないか?)の秘密が今解けた(w
0272253NGNG
253です。
これ以上は、スレ違いになるかもしれませんが、一応ほそくのつもりです。

bccのソースが手元にないので、記憶ですが、文の解析の部分はだいたい
次のようだったと思います。

>文の解析() {
> switch (現在のトークン) {
> case '{':
> 複合文の解析();
> break;
> (中略)
> case 識別子:
> 次のトークンを先読み();
> if (次のトークン == ':') {
> ラベル定義();
> goto RET;
> }
> 次のトークンを返却();
> /* No break */
> default:
> 式文の解析();
> }
> RET:
>}

トークンを1回読んだだけでは解析できないので、LL(1)にならないのは
この部分ではないかと、、、。
うーん、間違っているでしょうか?
0273デフォルトの名無しさんNGNG
すいません、インデントに失敗しました。見苦しいとおもいますが。
0274デフォルトの名無しさんNGNG
>>270
Java の static って(2)の意味(変数の寿命)でも使えるんだっけ?
あと、確か static ブロックって構文があるんだよな。

C# なら、static は(3)の意味(クラス変数)でしか使えないんだけどねぇ。

スレ違いっぽくなってきたんで sage
0275デフォルトの名無しさんNGNG
#includeと#define
0276デフォルトの名無しさんNGNG
>>255
いわゆる「左くくり出し」だな。

if文 := if ( expr ) stmt | if ( expr ) stmt else stmt

という構文規則を下記のように書き換えることによって
LL(1)で解析できる。

if文 := if ( expr ) stmt E
E := (空列) | else stmt
0277デフォルトの名無しさんNGNG
253=272は何を言いたいのか?
だれか解説せよ
0278デフォルトの名無しさんNGNG
#include の無限ループは文法側でなんとかならんかなぁ。
たまに↓のような書き方になってるところがあって困るんだが。

aaa.h
#include "bbb.h"

bbb.h
#include "aaa.h"


まぁ、設計が甘いってのと、
#ifndef _AAA_H_
#define _AAA_H_
・
・
#endif
ってやればいいんだが。なんか美しくない気がする・・・
0279Kusakabe YouichiNGNG
In article >>276, 276 デフォルトの名無しさん wrote:

> >>255
> いわゆる「左くくり出し」だな。
>
> if文 := if ( expr ) stmt | if ( expr ) stmt else stmt

lexだとこのif文の定義でwarningが2個出ますよね。
0280デフォルトの名無しさんNGNG
>>251 遅レスだが、禿同。
caseの範囲指定できれば随分見た目がスッキリすると思うが。
それか、例えば↓な感じで1行にまとめて書ければなぁ。

case (1,3,5): // 1,3,5を個別指定
case 1-4:   // 1から4までの範囲指定
0281デフォルトの名無しさんNGNG
>>278
_で始まる識別子は... グフッ
0282デフォルトの名無しさんNGNG
>>280
それを許すと 'A'-'Z' のようなコードが多発して
EBCDICで逝くコードが続発しそうだ。

それはおいといて、今ので全然不自由してないんだけど
少数派か?
0283デフォルトの名無しさんNGNG
>>280
case (1,3,5): くらいなら
case 1: case 3: case 5: と書いてもまあ悪くないと思う。
非常に多くの場合に同じ処理をすることはよくあるのだろうか?
0284デフォルトの名無しさんNGNG
>>278
うーん、どんなかたちであれ循環参照は避けた方が良いと思うから、
設計側で対処するべきだと思うけどなぁ
0285デフォルトの名無しさんNGNG
>>282
私も、

 年に一回ぐらい「範囲指定できたらいいのに」と思う。
 年に数回「お前のバグだろ、break ないぞ、ゴルァ」と怒る

ぐらいだ。nobreak がデフォルトになると、下らんデバッグの時間が減りそうだけど。
0286デフォルトの名無しさんNGNG
>>278 >>284

#define require(filename) \
#ifndef filename ## _provide \
#define filename ## _provide \
#include <filename> \
#endif
0287デフォルトの名無しさんNGNG
一度だけincludeされる
require(stdio.h)
require(stdio.h)
require(stdio.h)
require(stdio.h)
0288デフォルトの名無しさんNGNG
>>286-287
プリプロセッサ命令自体をマクロ展開できたっけ?
0289286NGNG
ネタです。できそうでできない事シリーズにでも加えてください。
0290デフォルトの名無しさんNGNG
>288
できればいいのにね。
まああの文法じゃ拡張しようがないけど。
; MASMのマクロは一貫性ゼロだけど便利だったなあ。
0291デフォルトの名無しさんNGNG
>>272
Borland C++ってオープンソースだったっけ?
0292デフォルトの名無しさんNGNG
>>291
272は253で
> ブルースエバンズ(著名な方のようですがスペルを忘れました)のCコンパイラ(再帰下降法)の
> ソースを覗いてみたら、そういうふうになっていたような気が、、、。
て書いてるから、bccてのはブルースエバンズ・C・コンパイラのことなんじゃないか?
0293デフォルトの名無しさんNGNG
>>291. 292

Borland C++ のソースもがんばって探すと落ちてるよ。
0294291NGNG
>>293
マジすか?
冗談すよね?
ほんとだったら、ほしい!!
(見てどーすんだ、、、)
0295デフォルトの名無しさんNGNG
ほんと。
現MS の C# 作った人が Borland にいたときに書いた、TurboPascal の
コンパイラソースも出回っている。

アメリカには残っていないようだけど、ブラジルあたりのアングラサイトで見かけた気がする。
0296デフォルトの名無しさんNGNG
違うbccのソースなら見たことある。
たしかlinux86とかいうプロジェクトの開発環境。
これと間違えてない?>>292 >>295
0297デフォルトの名無しさんNGNG
>>295
それと、ほんとならどっかの掲示板にあぷしてくれ
0298 NGNG
strcpy、strcatはいらない、sprintfでできてしまう。
sprintfバンザイ!
0299デフォルトの名無しさんNGNG
遅い>298
単純なベンチプログラムでも作って確認してみるとわかる。
0300デフォルトの名無しさんNGNG
strcpy,strcatいらない、stpcpy (非標準)バンザイだよ。
って、C++とは無関係だな。
0301デフォルトの名無しさんNGNG
while・for・doはいらない。全部if/gotoでできてしまう。
gotoバンサイ!
0302デフォルトの名無しさんNGNG
>>299
strcpyやstrcatもあんまりhot spotでは使わないからsprintfでもいいんじゃない?
バッファオーバーフロー対策ではsnprintfの使い勝手が(・∀・)イイ!!
0303デフォルトの名無しさんNGNG
>>302
そういう意味では std::string() に sprintf() ライクな書式指定つき文字列作成機能がなかったのが
残念だ。MFC/WTL の CString にはあるんだけどね。
0304デフォルトの名無しさんNGNG
>302
snprintfはANSI標準にないからな。
まあ作ればいいんだけど。
フォーマット書式文字列自体をコンパイルしてくれる仕様だったらいいんだが。
どうせほとんどfixed文字列使うんだから。
0305デフォルトの名無しさんNGNG
>>304
C99で標準になったYO!
0306名無しさん@Vim%ChaliceNGNG
Cは必要だから触るが、C++は絶対触りたくない。
virtualってのがわけわからん。
Delphiでも見かけたような気がするが、他の言語にはないよね?
M$が倒れる
↓
VC++も逝く
↓
Wisoでの仕事がなくなる
↓
C++のシェアがガタ落ちになる(予定)
↓
uma-
0307デフォルトの名無しさんNGNG
>>306
> Delphiでも見かけたような気がするが、他の言語にはないよね?
いいえ。っつか、むしろ他の OOPL だと virtual がデフォルト。
0308デフォルトの名無しさんNGNG
>>306
C++は必要じゃないのん?
VCが逝っても、C++のシェアがガタ落ちにはならんと思ふ。
もしVCが逝ってC++のシェアがガタ落ちなら Cのシェアも同様にガタ落ちでわ?
0309デフォルトの名無しさんNGNG
あきらめてC++勉強することにしたよ。
0310デフォルトの名無しさんNGNG
>>306
MSが潰れても、OOPにはCよりもC++のほうが便利だから
同じようなソフトがプラットフォームを変えて出現すると思われ。
0311デフォルトの名無しさんNGNG
C++が廃れても、Cは残るだろ。
組み込み系とかで。
0312デフォルトの名無しさんNGNG
>>311
それって,C が廃れてもアセンブラは残るだろ。組み込み系とかで。
って言っているのと同値。

fortran / cobol が,なんだかんだ言われても生き延びているように
C++ はそうかんたんには滅びなくなりました。
0313デフォルトの名無しさんNGNG
WindowsがC++で書かれている限りC++は無くならないよ
GCCも4が出る頃にはLinuxあたりもC++で書き直されている...わけないか(藁
0314デフォルトの名無しさんNGNG
>>276
> いわゆる「左くくり出し」だな。
(略)
> if文 := if ( expr ) stmt E
> E := (空列) | else stmt

これじゃあ、if (expr) [[if (expr) stmt else stmt]],
if (expr) [[if (expr) stmt]] else stmtとどちらでも良くて、『曖昧な文法』のままじゃん。

文法、いわゆる形式言語の話と、
特定のparser generatorの(LL(1)に逸脱した)仕様の話を混同してない?

if (expr) stmt else stmt endif

にするしかないよ。こうしないと、LL(1)解析可能どころか、
『文脈自由言語族に属する曖昧でない文法』じゃないから。

実用上はどうでもいいから、「逝ってよし」とは思わないけど。
0315デフォルトの名無しさんNGNG
>>313
とは言ってもkernel部分はCだし、UIというかCOMコンポーネント周りは
どんどんC# & CLRで置き換えられていきそうだし、すぐになくなる事は
ないにせよ、C++で書かれた部分は減っていきそうだな。
0316デフォルトの名無しさんNGNG
>>279
> lexだとこのif文の定義でwarningが2個出ますよね。

lexじゃなくて、yaccね。
shift/reduceがconflictうんぬんって。
0317デフォルトの名無しさんNGNG
>>315
LinuxじゃないんだからカーネルはCじゃないだろ。NTのマイクロ
カーネルはアセンブリだと思うけど。で、周りのサービスオブジェクト
がC++。ドライバもC++とインラインアセンブラ。

流れ的には、OS/サーバ/データベースみたいなハコ部分はC++、
ハコの中身はC#その他だね。CLRそれ自体も当然C++。
0318デフォルトの名無しさんNGNG
>>317
そーなの?
じゃWin32APIはCだけど、どういうこと?
0319デフォルトの名無しさんNGNG
>>318
WIN32APIがC++で書かれてたら
Cで使えなくならない?
0320デフォルトの名無しさんNGNG
>>318
APIがCだからどうだと? 意味がわからん。
0321320NGNG
>>319
>WIN32APIがC++で書かれてたら

これもかなり謎だが... 呼び出し規約とか分かってる?
0322318NGNG
いや、だから、
>>317の主張だと、Win32APIはアセンブラかC++のはずじゃない?
これって現状のことを言ってるんだよね?

C++をCでラッピングするってのは変だし、あのAPI群が全部アセンブラっ
てのもちょっと無理がある。だから、

>LinuxじゃないんだからカーネルはCじゃないだろ。NTのマイクロ

ってのは本当かなー、と思ったということ。
0323デフォルトの名無しさんNGNG
317のような知ったかがいるからネット上での情報収集は大変
0324デフォルトの名無しさんNGNG
315のような知ったかがいるからネット上での情報収集は簡単
0325失貴君NGNG
WindowsはPascalでかかれてますよ。ええ。一部はアセンブラですが。
0326デフォルトの名無しさんNGNG
闘うプログラマー読むと、NT kernelはCで書いてあるっぽいんだけど。
0327デフォルトの名無しさんNGNG
>>317, >>318
VBのマニュアルでさえ、外部リンケージの呼出し規約載ってるから読め!
$(GLIBC)/sysdeps/i386/sysdep.hで、system callどうやってるか見るとかさ。
0328デフォルトの名無しさんNGNG
>>326
まぁそれが順当だろうな。
0329デフォルトの名無しさんNGNG
>>319
>WIN32APIがC++で書かれてたら
>Cで使えなくならない?

実際に一部 C++ 的な部分もあるけど
IShellFolder とか IDropTarget とか、あのへん
えぇ、C から使えなくはないけど、大変に面倒でイヤです
C 使ってる人は諦めて C++ へ移行しませう
0330318NGNG
>>327
できるのは知ってる。
でも、すすんでやろうとは思わないでしょ、C++をCから呼ぶなんてのは。
それをやるメリットがないじゃん、ほとんど。
0331デフォルトの名無しさんNGNG
>>330 メリットが無くてもやらなきゃならん時がある。
0332デフォルトの名無しさんNGNG
WIN32APIはTurtleグラフィックスを実現する、LOGOで書かれています。
速度を見ればわかるでしょ?
0333デフォルトの名無しさんNGNG
>>326
NTの最初のバージョンはCだったかもしれんが、VC++6なんてツール
無かった時代の話だし、開発者の人数も(比較的)少なくてチームリーダの
意向がそのまま通った時代。ゲイツがC++を勧める以上、WindowsXPの
カーネルがC++になってない理由は無い。
0334デフォルトの名無しさんNGNG
カーネルをC++にするメリットがいまいちわからん。
0335デフォルトの名無しさんNGNG
基本機能が仮想関数になっているので、簡単に
変更できます。
0336デフォルトの名無しさんNGNG
ソース見たけどKernelのソースはファイル名が*.cになってるなぁ。

int strcmpW(const wchar_t *pwc1, const wchar_t *pwc2)
{
 int ret = 0;

 while ( !(ret = *pwc1 - *pwc2) && *pwc2)
  ++pwc1, ++pwc2;
 return ret;
}

こんなの発見。strcmpと違って返り値は-1,0,1じゃないんだね。
0337デフォルトの名無しさんNGNG
>>336
これってstrlen(pwc1) >= strlen(pwc2)の局面しか使わないのかね?
0338デフォルトの名無しさんNGNG
>>337
strlen(pwc1) < strlen(pwc2)
でも問題ないよ。
*pwc1=='\0' の時点で、(*pwc1 - *pwc2) !=0 になってループを抜けるから。
0339デフォルトの名無しさんNGNG
カーネルにはどうしてもアセンブラを使うところがでてくるとおもうけど、
アセンブラからC++呼ぶのは面倒じゃないのかな。
0340デフォルトの名無しさんNGNG
>>339
それは extern "C" とか使えばいいよ。
0341デフォルトの名無しさんNGNG
>>303
>そういう意味では std::string() に sprintf() ライクな書式指定つき文字列作成機能がなかったのが
>残念だ。MFC/WTL の CString にはあるんだけどね。

そういうときは、stringstream だね。激重だけど。 
0342336NGNG
>>339
アセンブラが必要なところは、ほとんどインラインアセンブラで済ましてるみたいだよ。
さすがに初期化コードは.asmだったが。
元々マルチプラットフォームなOSだから、アセンブラ自体あまり使ってないみたい。
0343デフォルトの名無しさんNGNG
>>336
strcmp って -1, 0, 1 だったか?
たしか strcmp も 負、0、正 だったと思うが、どうよ。
0344336NGNG
>>343
あ、そうだったっけ?
比較でVC++のcrtのソース見たら、わざわざ-1,0,1にしてたからそうなのかと思った。
たしかにヘルプみたら正、負としか書いてないや。
0345デフォルトの名無しさんNGNG
保全
0346デフォルトの名無しさんNGNG
a
0347 NGNG
goto
0348デフォルトの名無しさんNGNG
日下部陽一
0349デフォルトの名無しさんNGNG
機能かい!
0350デフォルトの名無しさんNGNG
保存あげ
0351デフォルトの名無しさんNGNG
strtok() コンテキストを識別できない。
知らないでネスティングして使ってると期待通りに動かない。
せめてハンドルとかでコンテキストを隔離できるようにしてほしい。
0352デフォルトの名無しさんNGNG
strtokは、scanfとならぶ
「一見便利そうだけど、つかうとドツボにはまる」
Cの罠関数、という罠。
0353デフォルトの名無しさんNGNG
>353
だけど、これらの罠関数に嵌って原因をちゃんと理解できたら半人前と判断できるよね?
でもシステム系のプロの多くは実装方法を教えても原因にはピンとこないらしい。
0354デフォルトの名無しさんNGNG
virtual継承はいらないと思う。ios以外に使用例はあるのか?
このあたりの解決は、Eiffelの仕様がうれしいのだが。
0355デフォルトの名無しさんNGNG
>>333
> カーネルがC++になってない理由は無い。
お前の妄想しか根拠はないのかよ
■ このスレッドは過去ログ倉庫に格納されています