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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん NGNG
 C/C++の滅多に使わん機能(標準ライブラリ含)を語るスレ
 個人的には広域ジャンプ使ったこと無し。
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 メリットが無くてもやらなきゃならん時がある。
■ このスレッドは過去ログ倉庫に格納されています