★ ANSI Cでいこうよ ★
■ このスレッドは過去ログ倉庫に格納されています
0001標準なおんなのこ
NGNG_/ ヽ _
/ , , ヽ ヽX 7ヽ、
i' / // / / | ヽヾ. 、 ヽ ヽX X ゝ
/| | | | |_⊥」| || | |.|」⊥_ | iミミ、X /
V| | || i|_⊥、W./ヽ|,|⊥_||ヽ|≡= x/
ヽNヽ| ,|し.j _|し.jl|` |T Τ7 / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| |.{  ̄ .'_,  ̄ || | | ||+ヽ < あははー、ANSI Cでプログラムしませんか?
| | i\ .1 | | | || +| \_______
| | | i : エ エ :´ : | | | | ||++|
| _ | | |´  ̄只 ̄ ヽ| | |_| ||++|
/ || | ノ || ヾ | | | ヽ| |++|
| || |- ´ i | | i `ー| | | | ||++|
| | | | | .| | | | | | || ̄
標準規格限定です。
標準ライブラリ、STLなどなど
MFC,VCLなどは禁止です
007571
NGNG自然かどうかより、sprintfの問題点(バッファのサイズを指定できない)を
持ち越さないために、Amendment1で追加されたswprintfはsize_t型の引数を
渡すようにしたはず。
それをchar文字列版に適用したsnprintfがC99で追加された。
つまり、安全面からすれば、Microsoftの仕様はsprintfと同じ問題点を持って
いることになる。しかも非標準。
もっとも、Microsoftのwchar.hは、C++でしかコンパイルできないし、
__STDC_VERSION__マクロが定義されないことからしても、Amendment1に対応し
ていないと見るべきなのかもしれない。
0076デフォルトの名無しさん
NGNG0077デフォルトの名無しさん
NGNGANSI CとC++を勘違いしてないか?
007871
NGNGMicrosoftのライブラリには、swprintfも_snwprintfもあるよ
size_tを受け取るsnprintfが標準仕様に追加されたのなら、
swprintfがsize_tを受け取るのは明らかに変だと思うのだが
007971
NGNGMicrosoftの処理系を使っていると、wsprintfや_stprintfからの類推で
あたかもswprintfがsprintfと対応する関数のような錯覚を起こしがち。
実際に対応するのはswprintfとsnprintfであって、sprintfワイド文字列
版は存在しない。sprintfは前述のような問題点があるので、過去のコード
との互換性のためだけに今後は存続すると見た方がよいのでは。
それから、紛らわしいので、人の名前を勝手に名乗らないように。
0080デフォルトの名無しさん
NGNG結局ANSIもK&Rと同じ穴の狢だったか。
0081デフォルトの名無しさん
NGNGどうでも良いが、処理系依存のコードを書くのに、
ANSIに準拠したコードを書く意味はあるのか?
>>41
>インラインアセンブラいらんぞ。
アドレスの参照が、限りなく面倒。
mov ebx,dword ptr [_table] ;等々
それでも、それをやった場合、コンパイラを使う意味は何処にある?
よって、インラインアセンブラは必要。
0082デフォルトの名無しさん
NGNG>どうでも良いが、処理系依存のコードを書くのに、
>ANSIに準拠したコードを書く意味はあるのか?
禿げしく同意。
しかし、完全な合致プログラムは命がけ!
008378
NGNG別にそれを使う使わないの問題じゃなくて
標準仕様の方が変じゃない?って言ってるだけ
だって、類推すると、snwprintfになるわけでしょ?
確かにsprintf自体がgetsと似た問題をはらんでる
わけだし、それ自体を変えたいのかなとも思うけど。
だからと言って、wsprintf->snprintfのワイド版
ってのは誤解を招く結果になるだけじゃないかな?
スマソ…バンゴウマチガエタ…イッテキマス
0084デフォルトの名無しさん
NGNG_snwprintf()
wsprintf()
等はANSI以外のところで勝手に作られた関数。
話がややこしくなるので持ち出すのはやめよう。
0085関数名無しエラーさん
NGNGってことでいいのかな?>1は。
ところで、gccやmsvcやbccとか、
最近?の処理系って皆対応してると考えていいの?
まあ、細かい所は色々解釈の違いがあるのかな?
0086デフォルトの名無しさん
NGNGANSIって
解釈の違い=処理系に依存していること
どうコンパイルすべきか決められない事態=未定義の仕様
って感じのごまかし方だったような…
0087デフォルトの名無しさん
NGNG普通の言語っぽくしたところはANSIの功績だと思うけど、
K&R互換を残したのが結果としてユーザーの不利益になった
と思う。C++程度の型の強さをあの時点で導入していたら
(OOじゃなくてね)ずいぶん世の中見とおしがよかったと
思うんだけどな。
0088デフォルトの名無しさん
NGNGあんましsprintf使ってないからわからん。
0089デフォルトの名無しさん
NGNGwsprintfはWindowsでしか使えないのと、対象となる型がTCHAR配列。
sprintfはホスト環境規格合致処理系なら必ず使えて、対象となる型が
char配列。
細かなことを言えば、wsprintfはエラーが発生したときにGetLastError
で原因を調べられるとか、C99に処理系が対応した場合には、sprintfを
使わないとlong long型を扱えなくなるとか。
0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNG009289
NGNG一口に規格合致処理系といっても、フリースタンディング環境もあるから、明示的に
ホスト環境といっているだけ。要は、パソコンやワークステーションのようなフル
セットのOS上で実行させるような環境がホスト環境。組み込み機器のようにOSなしで
実行させるような環境がフリースタンディング環境。
フリースタンディング環境では、stddef.hやlimit.hなどいくつかのヘッダはあるも
のの、ライブラリ関数は標準では一切サポートされない。
0093デフォルトの名無しさん
NGNGしかし、合致プログラミングってやればやるほどキリがないよ。
例えば1バイトが8ビットじゃないかもしれないって規格書には書いてあるよ。
そんな、殆どありえないような環境まで面倒みきれないのが現実。
合致レベルを設けてどこまでやるかの線引きをするか、
カテゴリ分けをしてカテゴリ間の互換性に制限を付けるか
して欲しいよ。
0094デフォルトの名無しさん
NGNGACOS-6だと恐らく9ビット下手したら6ビットだよ。
ありえないなんてことなく現実にそれなりに使われているマシンで
そういうことがある。
だから「その処理系でもっとも効率の良い語をintにする」なんて
言語で互換性うんぬんするのがそもそも間違いではなのか?
0095デフォルトの名無しさん
NGNGこれだからJavaが流行るんだよな。
0096デフォルトの名無しさん
NGNG>ホスト環境規格合致=ANSI規格合致ってことっすね。
これは違う。ANSI規格合致処理系には、ホスト環境規格合致処理系と、
フリースタンディング環境規格合致処理系の2種類があるということ。
>>94
CHAR_BITは8以上と定められているので、1バイト=6ビットの処理系は
非標準。
最も効率の良い型をintにするのは、特に互換性の妨げにはならない。
最低限の範囲が-32767〜+32767と規定されているので、その範囲内で
使えばよいだけのこと。
どうしてもサイズに依存するときは、stdint.hで定義されるint32_t
とかを使えばよい。
0097デフォルトの名無しさん
NGNGその範囲内で使えというのは現実問題として無理だろ。
実質互換性がないことの反証にはならないぞ。
009896
NGNGそれは単なるスキル不足。
0099デフォルトの名無しさん
NGNG分かっていないな、個人のスキルに依存する方法で
互換性を保つという方法論そのものがだめだっていってるんだよ。
世の中に出まわっているソフトを>>96の言うような整数の範囲に
変更できるか?
010096
NGNG移植性のあるコードを書くのは、そもそも相応のスキルが要求されるはず。
元々スキルの低い人間の手によるものや、移植性を考慮していないもの、
非標準の処理系を用いて作成されたものを、後から変更することなどは、
対象にしていない。
どんなにスキルの低い人間がプログラムしても互換性を保てるような言語
は、所詮大したことはできないよ。
0101デフォルトの名無しさん
NGNGそもそもこれ自体現実的な制約ではないから、スキルがあれば
OKとはならないんだよ。整数をこの範囲に保ってコードを
書いてあるプログラムがどれだけあるのか。
非現実な範囲でしか移植性のない言語は言語仕様に問題がある。
010296
NGNG現実的な制約でないというと、ほとんどの環境では負値に2の補数を使う
からということかな?
その場合でも、-(-32767-1)は-32768になってしまって正しい動作が期待
できないから、やはりそんな値を使うこと自体が間違っている。論理演算
なら問題ないだろうけど、その場合には16ビットの範囲を守ることはたや
すいからね。
もし、-2147483648〜+2147483647が一般的な範囲だと思っているなら、
それはとんでもない間違いだよ。
0103デフォルトの名無しさん
NGNG昔の16bit時代からやってる人なら、ちょっと大きな数がでてきそうな
ときには int ではなく long と書くのが普通。
でも最近の人はわかんないよ。int = long あたりまえと思ってる人が
多い。あと long = 32bit と仮定してるクソコードもたくさんあって、
Linux-AXP なんかで困る。
0104デフォルトの名無しさん
NGNGunsigned long 使う風習があるんだけど
これってどう思う?
アドレス幅といっしょなのって、大抵intの方じゃない?
勘違いならごめんよ
0105デフォルトの名無しさん
NGNG2の補数とワードのビット数をそろえるように設定するのは必須ですな。
完全 ISO-C じゃ非常に冗長なコードになるから
1の補数とかの環境は初めから捨てました。あとライブラリ関数が
かなり使えないのが苦しい。汎用性のある ISO-C のコードって
printf("hello"); くらいじゃないかな。(藁
まー、あまり期待はしてないけど K&R 時代よりは多少マシって
具合ですな。基本構造式まで処理系依存では逝ってしまいますので…。(藁
0106105
NGNGこれが適切に決まっていればもっと良いコードが書けるんだけど
これも1の補数と2の補数の両方の存在を見とめているためだ…。
ちとむかつく。(藁
0107デフォルトの名無しさん
NGNGそもそもポインタ=数値という前提でプログラムすること自体が規格外
0108デフォルトの名無しさん
NGNGそんなことないよ。intptr_tを使えばいいだけのこと。
0109デフォルトの名無しさん
NGNGLinux, Win32, BeOSなんて、比較的よく似たプラットフォームだからそんな
ことを言っていられるんだと思うよ。
8ビット〜64ビットCPUを対象にした組み込み用の汎用ライブラリを実装する
場合には、2の補数はともかく、算術型のサイズを特定することなど不可能。
それに、汎用性のあるISO Cのコードがprintf("hello");ぐらいというのは
まったく意味不明。
型変換が処理系依存って、有符合整数と無符合整数の間の型変換のこと?
そんなのはどちらでも正の値と分かっている場合以外、型変換すること自体
が間違っているよ。そもそも両者を混在させる必要なんてそうそうないはず。
0110デフォルトの名無しさん
NGNG0111デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNGfreeをしたらどうなりますか?
怖くてできません。
0115デフォルトの名無しさん
NGNGhttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/free.3.html
0116デフォルトの名無しさん
NGNGここらでSTLに挫折した、全体の95%相当のプログラマが
不買運動を起こし、消滅します。
ありがとうC言語!そしてC++さようなら!(^_^)また会えるといいね!
http://piza.2ch.net/test/read.cgi?bbs=tech&key=995820118&ls=100
0117デフォルトの名無しさん
NGNGすれ違う。
>>112 64bit環境では通常(MS以外)sizeof(int)=4 sizeof(int *)=8
0118デフォルトの名無しさん
NGNGPentium以降のデータバスって64bitじゃなかった?
>>117
ちと意味が違うのでは?
64bit環境でintが32bitなのは、intも64bitにすると必然的に
longも64bitになって、charとshortだけじゃ16bitの型あたり
を切り捨てなきゃならないからでしょ?
既に、intがCPUのワード幅であるって前提は崩れてるよ
0119デフォルトの名無しさん
NGNG先月からCやりだしたのでいまいちよく分かりません。
0120デフォルトの名無しさん
NGNGポインタのサイズはすべて一定です。。
short a;
int b = 100;
a = &b;
とかすれば問題だが...
0121デフォルトの名無しさん
NGNGANSI Cってポインタのサイズは同一であるとみとめてたっけ・・・。
コード領域を指すためのポインタとデータを指すためのポインタのサイズが違うことは多々ある
0122120
NGNGそーだったんですか。はずかシー。
0124デフォルトの名無しさん
NGNGでないとコンパクトモデルやミディアムモデルのMS-DOSの処理系が
規格準拠になりえないだろ
0125デフォルトの名無しさん
NGNG全てのポインタは同じ幅(=16bit)と考えていいのでは?
(みであむは知らない)
■ このスレッドは過去ログ倉庫に格納されています