アカウント名:
パスワード:
gccであることをいいことに、Cでも//でコメントアウトしてます。ごめんなさい(懺悔)
C99で//はコメント開始と規定されていますので問題なし!
# でも真面目な話、2011年現在で//から始まるコメントはCでないと言っちゃうのは勉強不足かと・・・# コンパイラの実装とは別にCもC++も規格は変化(進化とも退化ともいわん)していってますので。
>C99もC89の上位互換だけど
違います。例えば、
printf("%d\n", 10 //* 2 */ 2);
は、C99でもC89でも正しい構文だけど、結果は異なりますよね。
けど、いくらC99なら使えるっていっても、Cでmalloc/calloc使わずに可変長配列使えると言われると違和感あるけどなぁ。
Cでmalloc/calloc使わずに可変長配列使えると言われると違和感あるけどなぁ。
試しに領域を確保して開放するだけの関数と、可変長配列を確保するだけの関数を作って一千万回まわすと
可変長配列: 0.210000(秒)malloc: 76.670000(秒)
速度が要求されるんで最近は可変長配列ばっかり使ってるけどwindowsでは使えないらしい。実際はmalloc一千万回する人なんて居ないか。でもpowを数百万回まわす人は居たな。テーブルに置き換えたら恐ろしく早くなった。
#変数宣言の場所がめちゃくちゃになってきたらもう終わりだとおもう。orz
どちらかというと、可変長配列はallocaの代替ですから、なんでもかんでもmalloc/callocの代わりに可変長配列できるとは限りません。ある程度大きな領域の確保には依然としてmalloc/callocその他が必要です。
あと一応、Windowsで可変長配列が使えないのではなく、MSVCやBCCがC99対応していないだけなので、GCCならWindowsだろうがなんだろうが可変長配列使えます(Intelのはどうだったかな?)。
> MSVCやBCCがC99対応していないBCCの場合、デフォルトオフですけどC99に対応 [embarcadero.com]してますよ。以下、C++ Builder 2009 のコマンドラインヘルプ。
% bcc32 -h -ACodeGear C++ 6.10 for Win32 Copyright (c) 1993-2008 CodeGear使用できるオプション (* はデフォルトの設定。xxx はサブオプションで、-h -X などで表示) : (メモ: -X- または -w-XXX は、通常、-X による設定または設定解除を取り消します)(略) -An C99 準拠のキーワードと拡張を使用します -Ax C++-0x 準拠のキーワードと拡張を使用します
なお、C+ Builder 6(2002) では非対応でした。C++ Builder 2007 は未確認。
デフォルトでオフになってるのは、既存のコード(大半がC89レベル)との互換性の問題からでしょうか。
そういえば、かつてVisualC++のC++も、長らく変数のスコープが非標準(「for(int i = 0; i < n; i++){}」といった変数宣言がループ後も有効なまま)という問題があり [noppi.jp]、MFCなどのライブラリが非準拠な仕様に依存してるからこっちがデフォルトなままだという噂でしたけど、今では(2005=VC8以降)ちゃんと標準準拠 [microsoft.com]になってますね。
>> # でも真面目な話、2011年現在で//から始まるコメントはCでないと言っちゃうのは勉強不足かと・・・
「勉強不足」という意味ではそうかもしれないけど,前提条件無しで「//はCでコメントとして使える」と思っちゃう方が問題あるような気がするけどね.いくら「C99では使える」って言ったって,自分が使ってないコンパイラはどのバージョンからC99対応なのかなんて知らないし.
>> # でも真面目な話、2011年現在で//から始まるコメントはCでないと言っちゃうのは勉強不足かと・・・「勉強不足」という意味ではそうかもしれないけど,前提条件無しで「//はCでコメントとして使える」と思っちゃう方が問題あるような気がするけどね.いくら「C99では使える」って言ったって,自分が使ってないコンパイラはどのバージョンからC99対応なのかなんて知らないし.
例えば、関数プロトタイプは元々C++で導入された宣言方式で、それがC89でC言語に逆輸入されました。それを、それこそ10年ぐらい前の時点でも、K&Rを想定して「関数プロトタイプを使ってるのはCではない」とか言っちゃったらもうダメでしょう。
同じように、そろそろもうC89を捨ててもいいんじゃないでしょうか。
>> 同じように、そろそろもうC89を捨ててもいいんじゃないでしょうか。
そうやって「そろそろ~なんて古いものは捨てようぜ」で捨てられるなら,COBOLのコードなんてとっくに絶滅してるはずじゃないの?
UMLよりテキスト表示できるCOBOLのほうが表現しやすいことがある。COBOLで仕様書書いて、C++で実装してますが、何か?
>同じように、そろそろもうC89を捨ててもいいんじゃないでしょうか。
言語仕様を捨てて良いかどうかは、コンパイラやその他のツール、ライブラリやフレームワークの対応具合で決まる。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell
どこまでが笑い話・都市伝説なのか… (スコア:1, 興味深い)
究極的には 「// でコメントアウトできる C」みたいな…
Re: (スコア:0)
gccであることをいいことに、Cでも//でコメントアウトしてます。ごめんなさい(懺悔)
Re:どこまでが笑い話・都市伝説なのか… (スコア:0, 既出)
C99で//はコメント開始と規定されていますので問題なし!
# でも真面目な話、2011年現在で//から始まるコメントはCでないと言っちゃうのは勉強不足かと・・・
# コンパイラの実装とは別にCもC++も規格は変化(進化とも退化ともいわん)していってますので。
Re:どこまでが笑い話・都市伝説なのか… (スコア:3, 参考になる)
C++はC99の上位互換ではなく成っちゃうからなぁ
C++はほぼC89の上位互換でC99もC89の上位互換だけど
現在のC++とC99の互換性ってかなりなくなってるよね
struct foo {
int x;
int y;
} hoge = { .x = 0, .y = 1, };
なんてC++では不正な文法になるし
extern void foo( struct foo* p );
の関数に大して
foo( &((struct foo){ 0, 1 }) )
もC++的には不正だし
Re: (スコア:0)
>C99もC89の上位互換だけど
違います。例えば、
printf("%d\n", 10 //* 2 */ 2
);
は、C99でもC89でも正しい構文だけど、結果は異なりますよね。
Re:どこまでが笑い話・都市伝説なのか… (スコア:1)
けど、いくらC99なら使えるっていっても、Cでmalloc/calloc使わずに可変長配列使えると言われると違和感あるけどなぁ。
1を聞いて0を知れ!
Re:どこまでが笑い話・都市伝説なのか… (スコア:3, 興味深い)
Cでmalloc/calloc使わずに可変長配列使えると言われると違和感あるけどなぁ。
試しに領域を確保して開放するだけの関数と、可変長配列を確保するだけの関数を作って一千万回まわすと
可変長配列: 0.210000(秒)
malloc: 76.670000(秒)
速度が要求されるんで最近は可変長配列ばっかり使ってるけどwindowsでは使えないらしい。
実際はmalloc一千万回する人なんて居ないか。
でもpowを数百万回まわす人は居たな。テーブルに置き換えたら恐ろしく早くなった。
#変数宣言の場所がめちゃくちゃになってきたらもう終わりだとおもう。orz
Re:どこまでが笑い話・都市伝説なのか… (スコア:1)
どちらかというと、可変長配列はallocaの代替ですから、なんでもかんでもmalloc/callocの代わりに可変長配列できるとは限りません。ある程度大きな領域の確保には依然としてmalloc/callocその他が必要です。
あと一応、Windowsで可変長配列が使えないのではなく、MSVCやBCCがC99対応していないだけなので、GCCならWindowsだろうがなんだろうが可変長配列使えます(Intelのはどうだったかな?)。
Re:どこまでが笑い話・都市伝説なのか… (スコア:1)
> MSVCやBCCがC99対応していない
BCCの場合、デフォルトオフですけどC99に対応 [embarcadero.com]してますよ。以下、C++ Builder 2009 のコマンドラインヘルプ。
なお、C+ Builder 6(2002) では非対応でした。C++ Builder 2007 は未確認。
デフォルトでオフになってるのは、既存のコード(大半がC89レベル)との互換性の問題からでしょうか。
そういえば、かつてVisualC++のC++も、長らく変数のスコープが非標準(「for(int i = 0; i < n; i++){}」といった変数宣言がループ後も有効なまま)という問題があり [noppi.jp]、MFCなどのライブラリが非準拠な仕様に依存してるからこっちがデフォルトなままだという噂でしたけど、今では(2005=VC8以降)ちゃんと標準準拠 [microsoft.com]になってますね。
Re: (スコア:0)
>> # でも真面目な話、2011年現在で//から始まるコメントはCでないと言っちゃうのは勉強不足かと・・・
「勉強不足」という意味ではそうかもしれないけど,前提条件無しで「//はCでコメントとして使える」と思っちゃう方が問題あるような気がするけどね.いくら「C99では使える」って言ったって,自分が使ってないコンパイラはどのバージョンからC99対応なのかなんて知らないし.
Re:どこまでが笑い話・都市伝説なのか… (スコア:2, すばらしい洞察)
例えば、関数プロトタイプは元々C++で導入された宣言方式で、それがC89でC言語に逆輸入されました。
それを、それこそ10年ぐらい前の時点でも、K&Rを想定して「関数プロトタイプを使ってるのはCではない」とか言っちゃったらもうダメでしょう。
同じように、そろそろもうC89を捨ててもいいんじゃないでしょうか。
Re:どこまでが笑い話・都市伝説なのか… (スコア:1, すばらしい洞察)
>> 同じように、そろそろもうC89を捨ててもいいんじゃないでしょうか。
そうやって「そろそろ~なんて古いものは捨てようぜ」で捨てられるなら,COBOLのコードなんてとっくに絶滅してるはずじゃないの?
Re: (スコア:0)
UMLよりテキスト表示できるCOBOLのほうが表現しやすいことがある。
COBOLで仕様書書いて、C++で実装してますが、何か?
Re:どこまでが笑い話・都市伝説なのか… (スコア:1)
>同じように、そろそろもうC89を捨ててもいいんじゃないでしょうか。
言語仕様を捨てて良いかどうかは、コンパイラやその他のツール、
ライブラリやフレームワークの対応具合で決まる。