トップページtech
125コメント40KB

★ 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などは禁止です
007571NGNG
>>72
自然かどうかより、sprintfの問題点(バッファのサイズを指定できない)を
持ち越さないために、Amendment1で追加されたswprintfはsize_t型の引数を
渡すようにしたはず。
それをchar文字列版に適用したsnprintfがC99で追加された。
つまり、安全面からすれば、Microsoftの仕様はsprintfと同じ問題点を持って
いることになる。しかも非標準。
もっとも、Microsoftのwchar.hは、C++でしかコンパイルできないし、
__STDC_VERSION__マクロが定義されないことからしても、Amendment1に対応し
ていないと見るべきなのかもしれない。
0076デフォルトの名無しさんNGNG
>>1 てめぇ犯すぞゴルァ
0077デフォルトの名無しさんNGNG
>>74
ANSI CとC++を勘違いしてないか?
007871NGNG
>>75
Microsoftのライブラリには、swprintfも_snwprintfもあるよ
size_tを受け取るsnprintfが標準仕様に追加されたのなら、
swprintfがsize_tを受け取るのは明らかに変だと思うのだが
007971NGNG
>>78
Microsoftの処理系を使っていると、wsprintfや_stprintfからの類推で
あたかもswprintfがsprintfと対応する関数のような錯覚を起こしがち。
実際に対応するのはswprintfとsnprintfであって、sprintfワイド文字列
版は存在しない。sprintfは前述のような問題点があるので、過去のコード
との互換性のためだけに今後は存続すると見た方がよいのでは。

それから、紛らわしいので、人の名前を勝手に名乗らないように。
0080デフォルトの名無しさんNGNG
なんだぁANSIってこんなに方言OK仕様なのか。
結局ANSIもK&Rと同じ穴の狢だったか。
0081デフォルトの名無しさんNGNG
>>ALL
どうでも良いが、処理系依存のコードを書くのに、
ANSIに準拠したコードを書く意味はあるのか?

>>41
>インラインアセンブラいらんぞ。
アドレスの参照が、限りなく面倒。
mov ebx,dword ptr [_table] ;等々
それでも、それをやった場合、コンパイラを使う意味は何処にある?
よって、インラインアセンブラは必要。
0082デフォルトの名無しさんNGNG
>>81
>どうでも良いが、処理系依存のコードを書くのに、
>ANSIに準拠したコードを書く意味はあるのか?
禿げしく同意。
しかし、完全な合致プログラムは命がけ!
008378NGNG
>>79
別にそれを使う使わないの問題じゃなくて
標準仕様の方が変じゃない?って言ってるだけ
だって、類推すると、snwprintfになるわけでしょ?

確かにsprintf自体がgetsと似た問題をはらんでる
わけだし、それ自体を変えたいのかなとも思うけど。
だからと言って、wsprintf->snprintfのワイド版
ってのは誤解を招く結果になるだけじゃないかな?

スマソ…バンゴウマチガエタ…イッテキマス
0084デフォルトの名無しさんNGNG
_snprintf()
_snwprintf()
wsprintf()
等はANSI以外のところで勝手に作られた関数。
話がややこしくなるので持ち出すのはやめよう。
0085関数名無しエラーさんNGNG
ANSIを満たしたすべての処理系で正常に動作するプログラム
ってことでいいのかな?>1は。

ところで、gccやmsvcやbccとか、
最近?の処理系って皆対応してると考えていいの?

まあ、細かい所は色々解釈の違いがあるのかな?
0086デフォルトの名無しさんNGNG
>まあ、細かい所は色々解釈の違いがあるのかな?
ANSIって
解釈の違い=処理系に依存していること
どうコンパイルすべきか決められない事態=未定義の仕様
って感じのごまかし方だったような…
0087デフォルトの名無しさんNGNG
>>86 実質整数型しか持たないK&Rにプロトタイプで色づけして
普通の言語っぽくしたところはANSIの功績だと思うけど、
K&R互換を残したのが結果としてユーザーの不利益になった
と思う。C++程度の型の強さをあの時点で導入していたら
(OOじゃなくてね)ずいぶん世の中見とおしがよかったと
思うんだけどな。
0088デフォルトの名無しさんNGNG
sprintfとwsprintfの違いってなに?
あんましsprintf使ってないからわからん。
0089デフォルトの名無しさんNGNG
>>88
wsprintfはWindowsでしか使えないのと、対象となる型がTCHAR配列。
sprintfはホスト環境規格合致処理系なら必ず使えて、対象となる型が
char配列。
細かなことを言えば、wsprintfはエラーが発生したときにGetLastError
で原因を調べられるとか、C99に処理系が対応した場合には、sprintfを
使わないとlong long型を扱えなくなるとか。
0090デフォルトの名無しさんNGNG
ホスト環境規格合致ってナニ?
0091デフォルトの名無しさんNGNG
ホストの環境の規格が合致してる処理系のこと。
009289NGNG
>>90
一口に規格合致処理系といっても、フリースタンディング環境もあるから、明示的に
ホスト環境といっているだけ。要は、パソコンやワークステーションのようなフル
セットのOS上で実行させるような環境がホスト環境。組み込み機器のようにOSなしで
実行させるような環境がフリースタンディング環境。
フリースタンディング環境では、stddef.hやlimit.hなどいくつかのヘッダはあるも
のの、ライブラリ関数は標準では一切サポートされない。
0093デフォルトの名無しさんNGNG
ホスト環境規格合致=ANSI規格合致ってことっすね。

しかし、合致プログラミングってやればやるほどキリがないよ。
例えば1バイトが8ビットじゃないかもしれないって規格書には書いてあるよ。
そんな、殆どありえないような環境まで面倒みきれないのが現実。

合致レベルを設けてどこまでやるかの線引きをするか、
カテゴリ分けをしてカテゴリ間の互換性に制限を付けるか
して欲しいよ。
0094デフォルトの名無しさんNGNG
>>93
ACOS-6だと恐らく9ビット下手したら6ビットだよ。
ありえないなんてことなく現実にそれなりに使われているマシンで
そういうことがある。
だから「その処理系でもっとも効率の良い語をintにする」なんて
言語で互換性うんぬんするのがそもそも間違いではなのか?
0095デフォルトの名無しさんNGNG
POSIXにまで限定してもなお非互換が山のように残る。
これだからJavaが流行るんだよな。
0096デフォルトの名無しさんNGNG
>>93
>ホスト環境規格合致=ANSI規格合致ってことっすね。
これは違う。ANSI規格合致処理系には、ホスト環境規格合致処理系と、
フリースタンディング環境規格合致処理系の2種類があるということ。

>>94
CHAR_BITは8以上と定められているので、1バイト=6ビットの処理系は
非標準。
最も効率の良い型をintにするのは、特に互換性の妨げにはならない。
最低限の範囲が-32767〜+32767と規定されているので、その範囲内で
使えばよいだけのこと。
どうしてもサイズに依存するときは、stdint.hで定義されるint32_t
とかを使えばよい。
0097デフォルトの名無しさんNGNG
>>96 互換性を逸脱する利用時に警告を出すなりの処理系がなければ
その範囲内で使えというのは現実問題として無理だろ。
実質互換性がないことの反証にはならないぞ。
009896NGNG
>>97
それは単なるスキル不足。
0099デフォルトの名無しさんNGNG
>>98
分かっていないな、個人のスキルに依存する方法で
互換性を保つという方法論そのものがだめだっていってるんだよ。
世の中に出まわっているソフトを>>96の言うような整数の範囲に
変更できるか?
010096NGNG
>>99
移植性のあるコードを書くのは、そもそも相応のスキルが要求されるはず。
元々スキルの低い人間の手によるものや、移植性を考慮していないもの、
非標準の処理系を用いて作成されたものを、後から変更することなどは、
対象にしていない。

どんなにスキルの低い人間がプログラムしても互換性を保てるような言語
は、所詮大したことはできないよ。
0101デフォルトの名無しさんNGNG
>最低限の範囲が-32767〜+32767
そもそもこれ自体現実的な制約ではないから、スキルがあれば
OKとはならないんだよ。整数をこの範囲に保ってコードを
書いてあるプログラムがどれだけあるのか。
非現実な範囲でしか移植性のない言語は言語仕様に問題がある。
010296NGNG
>>101
現実的な制約でないというと、ほとんどの環境では負値に2の補数を使う
からということかな?
その場合でも、-(-32767-1)は-32768になってしまって正しい動作が期待
できないから、やはりそんな値を使うこと自体が間違っている。論理演算
なら問題ないだろうけど、その場合には16ビットの範囲を守ることはたや
すいからね。
もし、-2147483648〜+2147483647が一般的な範囲だと思っているなら、
それはとんでもない間違いだよ。
0103デフォルトの名無しさんNGNG
>>102
昔の16bit時代からやってる人なら、ちょっと大きな数がでてきそうな
ときには int ではなく long と書くのが普通。

でも最近の人はわかんないよ。int = long あたりまえと思ってる人が
多い。あと long = 32bit と仮定してるクソコードもたくさんあって、
Linux-AXP なんかで困る。
0104デフォルトの名無しさんNGNG
Linuxのアプリケーションは、アドレスの表現に
unsigned long 使う風習があるんだけど
これってどう思う?
アドレス幅といっしょなのって、大抵intの方じゃない?
勘違いならごめんよ
0105デフォルトの名無しさんNGNG
linux,win32,BeOSでとりあえず動くプログラム組んだけど
2の補数とワードのビット数をそろえるように設定するのは必須ですな。
完全 ISO-C じゃ非常に冗長なコードになるから
1の補数とかの環境は初めから捨てました。あとライブラリ関数が
かなり使えないのが苦しい。汎用性のある ISO-C のコードって
printf("hello"); くらいじゃないかな。(藁
まー、あまり期待はしてないけど K&R 時代よりは多少マシって
具合ですな。基本構造式まで処理系依存では逝ってしまいますので…。(藁
0106105NGNG
あ、でも型変換とか処理系依存が激しいんだよね…。
これが適切に決まっていればもっと良いコードが書けるんだけど
これも1の補数と2の補数の両方の存在を見とめているためだ…。
ちとむかつく。(藁
0107デフォルトの名無しさんNGNG
>>104
そもそもポインタ=数値という前提でプログラムすること自体が規格外
0108デフォルトの名無しさんNGNG
>>107
そんなことないよ。intptr_tを使えばいいだけのこと。
0109デフォルトの名無しさんNGNG
>>105-106
Linux, Win32, BeOSなんて、比較的よく似たプラットフォームだからそんな
ことを言っていられるんだと思うよ。
8ビット〜64ビットCPUを対象にした組み込み用の汎用ライブラリを実装する
場合には、2の補数はともかく、算術型のサイズを特定することなど不可能。
それに、汎用性のあるISO Cのコードがprintf("hello");ぐらいというのは
まったく意味不明。

型変換が処理系依存って、有符合整数と無符合整数の間の型変換のこと?
そんなのはどちらでも正の値と分かっている場合以外、型変換すること自体
が間違っているよ。そもそも両者を混在させる必要なんてそうそうないはず。
0110デフォルトの名無しさんNGNG
109はド素人だな。放置。
0111デフォルトの名無しさんNGNG
>>104 intは演算レジスタでは?
0112104NGNG
>>107
そう。規格外のことだと思う。
でもカーネル読んでるとそういうの多くてさ・・・

>>111
大抵、アドレスバスとデータバスの幅は同じだよね。視野狭い?
0113デフォルトの名無しさんNGNG
暗視?
0114デフォルトの名無しさんNGNG
malloc()で領域を確保していないポインタに対して
freeをしたらどうなりますか?
怖くてできません。
0115デフォルトの名無しさんNGNG
>>114
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/free.3.html
0116デフォルトの名無しさんNGNG
C++は、もう破滅寸前。
ここらでSTLに挫折した、全体の95%相当のプログラマが
不買運動を起こし、消滅します。

ありがとうC言語!そしてC++さようなら!(^_^)また会えるといいね!

http://piza.2ch.net/test/read.cgi?bbs=tech&key=995820118&ls=100
0117デフォルトの名無しさんNGNG
C89/C99 ANSI Cの両規格の話が混ざっているので話が
すれ違う。

>>112 64bit環境では通常(MS以外)sizeof(int)=4 sizeof(int *)=8
0118デフォルトの名無しさんNGNG
>>112
Pentium以降のデータバスって64bitじゃなかった?

>>117
ちと意味が違うのでは?

64bit環境でintが32bitなのは、intも64bitにすると必然的に
longも64bitになって、charとshortだけじゃ16bitの型あたり
を切り捨てなきゃならないからでしょ?

既に、intがCPUのワード幅であるって前提は崩れてるよ
0119デフォルトの名無しさんNGNG
ポインタのサイズが問題になるケースってどんなときなんでしょうか?
先月からCやりだしたのでいまいちよく分かりません。
0120デフォルトの名無しさんNGNG
>>119
ポインタのサイズはすべて一定です。。
short a;
int b = 100;
a = &b;
とかすれば問題だが...
0121デフォルトの名無しさんNGNG
>>120
ANSI Cってポインタのサイズは同一であるとみとめてたっけ・・・。
コード領域を指すためのポインタとデータを指すためのポインタのサイズが違うことは多々ある
0122120NGNG
>>121
そーだったんですか。はずかシー。
0123デフォルトの名無しさんNGNG
>>118 >>104 == >>112 だから>>112は sizeof(int) == sizeof(int *)
と思っているってこと。
0124デフォルトの名無しさんNGNG
>>122
でないとコンパクトモデルやミディアムモデルのMS-DOSの処理系が
規格準拠になりえないだろ
0125デフォルトの名無しさんNGNG
コンパクトモデルはセグメント関係ないので、
全てのポインタは同じ幅(=16bit)と考えていいのでは?
(みであむは知らない)
■ このスレッドは過去ログ倉庫に格納されています