1 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:52:45 ] このスレは標準C規格や規格に合致した移植性の高い記法・技法に関するスレです。 C言語初心者の初歩的な質問、GUIなどの標準Cではできない事の質問、 ソース丸投げ、宿題、書籍 などは専門の別スレッド↓があるのでそちらへ。 C言語なら俺に聞け(入門篇) Part 24 pc11.2ch.net/test/read.cgi/tech/1201083176/ 【初心者歓迎】C/C++室 Ver.47【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1200464091/ C/C++の宿題を片付けます 103代目 pc11.2ch.net/test/read.cgi/tech/1200318925/ 【書き込む前に】 ・まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。 ・質問する前には最低限検索を。 ・エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。 【参考文献】 C FAQ 日本語訳 www.kouno.jp/home/c_faq/ Cプログラマ必読 ・プログラミング言語C(通称 K&R) www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244 【このスレのログ】 前スレ:pc11.2ch.net/test/read.cgi/tech/1190261457/ 他の過去ログ:nssearch.hp.infoseek.co.jp/clang/ 【このスレ住人としての心得】 わざとスレ違いあるいはごく低レベルな質問を繰り返して 流れを妨害する荒らしがいます。適当に誘導して放置してください。
357 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 23:58:57 ] いや、shadowされているが未定義である状態。
358 名前:349 mailto:sage [2008/08/07(木) 00:23:41 ] >>357 >>354 のこの部分 >識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、 >その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって >終了する。 これは有効範囲の終わりについてのみ言及しており、 変数自体は変数宣言以降から有効になるのではないの?
359 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 00:29:19 ] だからそういっているんだが。
360 名前:349 mailto:sage [2008/08/07(木) 00:52:52 ] shadow されるのは 1.同一変数名の定義されているブロックの開始部分からなのか 2.それとも同一変数名が宣言された後なのか というところで 2 で解釈可能では? ちなみに下記のコードで gcc および Borland C++ Compiler では、警告も無し // 出力結果は a=2.000000 *p=3 が保障される? #include<stdio.h> int main(){ int a=3; { int *p=&a; double a=2.0; printf("a=%f *p=%d\n", a, *p); } return 0; }
361 名前:349 mailto:sage [2008/08/07(木) 01:15:04 ] >>360 の int *p=&a; の行が規格としては 1.エラーになるべきか 2.未定義(実装依存、鼻から悪魔)か が知りたいのですが >>357 さんは 2 ということでしょうか?
362 名前:349 mailto:sage [2008/08/07(木) 01:16:35 ] >>361 に追記 3.定義済み (>>360 のコードは規格に沿っている)
363 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 01:17:28 ] ISO の、ダウンロードできるドラフトでは >354 が引用した部分の直後にスコープの開始位置に ついての説明があった。それによると、変数名のスコープが始まるのは変数宣言内の変数名の 直後。 ってことで >351 は OK 。
364 名前:349 mailto:sage [2008/08/07(木) 01:20:49 ] >>363 ありがとうございます スッキリしました これでゆっくり眠れます
365 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 08:59:54 ] 真偽値は非ゼロとゼロ、というのは環境依存でしょうか それとも規格上間違いなく非ゼロが真、ゼロが偽でしょうか
366 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 10:34:25 ] 規格上決まってる
367 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 12:29:25 ] >366 ありがとうございます
368 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 23:28:03 ] pc11.2ch.net/test/read.cgi/tech/1225320579/951- int main(){/* ... */}が標準準拠かどうか揉めてます 識者の見解をお願いします
369 名前:デフォルトの名無しさん [2008/11/17(月) 00:03:47 ] >>368 X 3010:2003 (ISO/IEC 9899:1999)より抜粋 > 5.1.2.2.1 プログラム開始処理 プログラム開始処理において呼び出される関数の名前は,main とする。 > 処理系は,この関数に対して関数原型を宣言しない。この関数は,次の4 種類の方法のいずれかで定義し > なければならない。 > − 返却値の型int をもち仮引数をもたない関数 > int main(void) { /* ... */ } > − 二つの仮引数をもつ関数(仮引数は,これらが宣言された関数に対して局所的であるため,どのよう > な名前を使用してもよいが,ここではargc 及びargv とする。) > int main(int argc, char * argv[]) { /* ... */ } > − 上に掲げた二つの方法のいずれかと等価な方法(9) > − 上に掲げた三つの方法のいずれでもない処理系定義の方法 最後の処理系定義(文書化)が遵守されている処理系において厳密でないほうの規格合致プログラムだな
370 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 00:10:42 ] Cでは基本的に () と (void) は異なるが、 関数定義においては同じとされていたはず。 GCC ではそうなってなかった気はするが・・・。
371 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 00:40:22 ] そもそも組込みには必ずしもmain()はない・・・というのはここでは禁句かな? しかし、いくらC言語の規格に準拠していても、MISRAに準拠していないと言うことで プログラムの作りかえをさせられるのはウザイ・・・ 逸脱手順を書くのもウザイ・・・
372 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 22:48:37 ] >>368 言いだしっぺです。 int main() が標準準拠かどうか?でもめているのではなく、(そういうことならいうまでもなく標準準拠に決まっています。) int main(void) を標準としたのは馬鹿じゃないの?ということです。 昔 fj でもめたのを受け売りしただけですね、はい。
373 名前:デフォルトの名無しさん [2008/11/17(月) 22:53:25 ] >>372 main() は K&R 準拠だろ
374 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:32:05 ] >>371 ホスト環境とスタンドなんとか環境ですね
375 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 03:21:32 ] >>372 int main(void) 以外の何を標準にするべきで、そうすると何がうれしいと思ってるの?
376 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 05:04:56 ] >>375 int main(void) は削除するのがいいでしょうね。 int main() という書き方が現在でも有効であるのに、なぜわざわざ int main(void) というセンスのない書き方をまかり通すのか理解に苦しみます。 そのこころは、つpc11.2ch.net/test/read.cgi/tech/1225320579/962
377 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 08:41:44 ] こちらは将来的に削除される予定 > int main()
378 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 11:05:40 ] >>376 リンクされたスレは既に dat 落ちで見れない。
379 名前:デフォルトの名無しさん [2008/11/19(水) 12:25:34 ] >>376 センスがないって、どのように?
380 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 18:55:51 ] (void)にセンスがないというのは理解できる。 空の()で引数がないことを表すことにしたC++の英断は素晴らしい。
381 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 18:58:42 ] Cの方は過去のしがらみもあったしな
382 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 20:11:19 ] くだらねぇぇぇぇ
383 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 20:17:17 ] 引数チェックのない時代の名残だからな。
384 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 21:03:20 ] >>379 呼び出し側は引数の有無にかかわらず同じだったとしたら、呼び出し側の実際と違う宣言をなんの躊躇もなく記述するところ。
385 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 21:07:22 ] >>384 main の呼び出し側はスタートアップ関数であって、 スタートアップ関数はコンパイラが提供するものだろ・・・。
386 名前:デフォルトの名無しさん [2008/11/19(水) 22:13:58 ] >>384 呼び出し側の実際の宣言は何だと思っている?
387 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 22:52:01 ] ソースコード側でC言語の管轄外の世界に勝手な仮定置いちゃダメだろ 標準的に考えて
388 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 23:08:45 ] >>387 プログラム開始処理(program startup)が main を呼ぶ事は 5.1.2.2.1 プログラム開始処理 に規定されている。
389 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 23:09:40 ] きっとOSが「いんとめいんかっことじかっこ…」とかコマンド打ち込んでると思ってるんだろう
390 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 23:14:16 ] >>388 プログラム開始処理がmainを呼ぶ時に引数をチェックしないなんて規定されてたっけ
391 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 23:18:19 ] >>390 多分お前の話したい奴は別の奴だ。
392 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 23:24:13 ] スタートアップ処理はコンパイラが用意するから main がどうなっていようと良きに計らってくれるっしょ。
393 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 23:58:18 ] main関数の定義でint main()と書いてるんだから 引数なし以外ありえない。 関数宣言での引数省略と勘違いしてるんだろうね
394 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:07:12 ] >>385 スタートアップ関数は引数の有無にかかわらず同じだったとしたら、スタートアップ側の実際の違う宣言を躊躇なく記述することに疑問を感じています。
395 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:10:41 ] >>386 実際のところ、 int main(int argc, char **argv, char **env) でしょうか。私のところの某処理系では環境変数がコンパイル時スタックをつぶしてしまうので可能なときは再コンパイルしていました。 これってヘッダをさわっただけではどうにもならなかったですよね。
396 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:11:12 ] >>387 だから int main() なのでは?
397 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:12:11 ] >>389 某処理系のfork()やexec*()の存在くらいは知っています。
398 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:12:42 ] >>392 それはそうですね。
399 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:14:51 ] >>393 それはそうですね。 コンパイラ側が勝手に stdcall をデフォルトとしている世界であれば、逆に int main(void) でないと困るのかもしれません。 んー ms-pascal?
400 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:29:00 ] >>390 プログラム開始処理が main() のために引数を整えている、と理解していますが、実際のところは誰がしているのでしょうか?
401 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:33:38 ] >>400 ご明察の通り、スタートアップルーチンがお膳立てします。
402 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:39:02 ] osとcrt
403 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:41:42 ] >>376 実は main は関係無くて、引数無しの関数の引数リストが void なのが不満なだけなのか?
404 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:42:51 ] 不満なら書かなきゃいいだけの話では?
405 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:43:24 ] >>394 >スタートアップ関数は引数の有無にかかわらず同じだったとしたら、 その仮定がおかしい
406 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:47:08 ] 実際同じじゃね? 呼び出し側で積んだ引き数は、呼ばれた側が無視しても全く問題ないわけだし。 例えばint func() {return 0;}という関数を宣言なしでfunc(0)と呼ぶときと事情は変わらない。
407 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:51:44 ] >>402 os? shell ではないのですか? というか shell と crt との役割分担は?あー ms-dos以外の場合で、てことで。
408 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:53:54 ] >>405 ん、たしかに stdcall がデフォルトのコンパイラがあったとしたら、その場合スタートアップ関数は int main(int c, char **v) と int main(void) とでは異なるでしょうね。
409 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:54:44 ] >>403 ん、そです。
410 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 00:55:48 ] >>409 すると、>406のようなfuncも気に入らないと。 >>408 >406
411 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:00:18 ] >>410 int func(void) {return 0;}と書いておきながら、func(0)と呼ぶのが気に入らないだけなんですが。
412 名前:407 mailto:sage [2008/11/20(木) 01:01:11 ] >>402 shell の末尾は exec*() でしたね。失礼しました。
413 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:06:17 ] >>409 古い(規格化以前?の) C では、引数リストが空の関数宣言は引数の数や個数を指定せずに 関数を宣言するものとなっていた。規格化にあたってそういった過去のコードを不正としないように 配慮した。そういうことだと思う。規格を決めた人が馬鹿だったわけじゃないでしょ。
414 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:30:17 ] >>413 そうではなくて、 func() に必要な引数はないけれども、func(0, 1, 2, 3 ... ) と呼び出さざるを得ない状況で func() の宣言をどうするか? という問題です。 このとき、int func(void) と宣言するのは、 すっごくやです。
415 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:41:31 ] int func(...);
416 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:45:50 ] >>415 %gcc test.c test.c:3 error: ISO C requires a named argument before ...
417 名前:408 mailto:sage [2008/11/20(木) 02:18:24 ] >>410 > >>408 > >406 ん?stdcall はreturn時に呼び出され側でスタックを払うから、呼び出し側は呼び出され側の引数を完全無欠に知っておかなければならないかと。
418 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 02:53:28 ] >すっごくやです。 し ら ね え よ
419 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 03:10:51 ] >>414 > func() に必要な引数はないけれども、func(0, 1, 2, 3 ... ) と呼び出さざるを得ない状況で >416 のとおり、そういうことはできないことになっている。
420 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 03:14:04 ] >>418 論理的な思考の根源には、ある種の好き嫌いの視点からの判断が含まれることも多々あるのですが、 お気に召さないのであれば、いいなおしましょうか。 「int main(void)は、main() の呼び出し側に思いを馳せていない、という点で、規約としては問題があるかと思います。」
421 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 03:21:36 ] >>419 いいえ、>>416 は、 不定長引数の場合はすくなくとも一つの引数には名前がついていなければならない、と述べているにすぎません。 コンパイル単位が別であれば、 int func(void) { return 0; } に対して、 func(0, 1, 2, 3, 4, 5, 6, 7) を呼び出すことは可能です。リンカもエラーは吐きません。
422 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 03:30:19 ] >>420 なら、main(void)用とmain(int argc, char **argv)用のスタートアップルーチンを用意して、 プログラムに合うように選択する処理系があったらint main(void)でも構わないのか? ……自分で書いていて詭弁のガイドラインに抵触するような気がしてきた。
423 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 03:33:37 ] >>421 あるコンパイル単位では int func(int a, ...) と宣言して、別のコンパイル単位で int func(void) で定義するってこと? それなら未定義動作だよ。コンパイルできてもリンクできても議論に値しない。
424 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:03:29 ] >>423 正確には、あるコンパイル単位では int func(void) と定義しておいて、 別のコンパイル単位から func(0, 1, 2, 3) と呼び出します。 未定義であることの記述があれば教えてください。 というより、cdecl と stdcall の話は処理系依存といえますから、この手の話が規約に載ることもないでしょう。 でも stdcall ならば可変長引数は困難ですし、でも cdecl/stdcall の話が可変長引数に絡むし、そして可変長引数は定義されていますし、 実装によっては不可能な仕様というものでも定義されているのは、どういうことなのでしょうか? それはそうと、ほとんどのコンパイラでは、スタートアップと main() とのリンクは、上述のようになっているのですが‥‥‥。
425 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:04:22 ] >>422 そういうことになります。お目にかかったことはありませんが、完全無欠のstdcall仕様のコンパイラがあれば。
426 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:12:55 ] >>424 「別のコンパイル単位」では宣言無しで呼び出すってことか。 どっちにしても未定義動作だけどな。 6.5.2.2 Function calls p6 より > 6 If the expression that denotes the called function has a type that does not include a > prototype, ... (snip) > If the number of arguments does not equal the number of parameters, the > behavior is undefined. If the function is defined with a type that includes a prototype, and > either the prototype ends with an ellipsis (, ...) or the types of the arguments after > promotion are not compatible with the types of the parameters, the behavior is undefined. ちなみに、スタートアップと main() とのリンクについては処理系ごとに好きにすればいい話で、 引数リストとかもう関係ない。
427 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:25:55 ] >>426 なるほど。 これを見る限り、可変長引数も「実は未定義」なんでしょうか?んー、prnitf() はどうなるのでしょうか? >スタートアップと main() とのリンクについては処理系ごとに好きにすればいい話 それでは、なおさら、int main(void) を標準的な記法として盛り込むの問題かと。int main(void) は現実から乖離しています。いらない子です。
428 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:35:26 ] >>427 可変長引数は ... を含むプロトタイプ付き関数として定義されている。 main() とのリンク方法が処理系依存でも、処理系に食わせるプログラム自体は 移植性を持つ必要がある。全然関係ない話。 main() の話がしたければ >>375 の質問に対して主観を排除した答えを出せ。
429 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 06:46:29 ] >>428 ん?引用された文章をみると、 > If the function is defined with a type that includes a prototype, and > either the prototype ends with an ellipsis (, ...) or (略) > the behavior is undefined. だから「... を含むプロトタイプ付き関数」すなわち可変長引数の振る舞いは "undefined" なのでは? > 処理系に食わせるプログラム自体は移植性を持つ必要がある。 おっしゃる意味がよくわかりません。移植性をもたせることと int main(void) の表記とどのような関係があるのでしょうか? >主観を排除した ではpc11.2ch.net/test/read.cgi/tech/1225320579/962 を再掲します。 >> c でよく採用された実装では、呼び出され側のコードは、呼び出し側の引数の個数や種類に依存しない、というもの。....※ >> 個々の関数は翻訳単位を別にとることが可能ですよね。無論、呼び出し側・呼び出され側の引数のチェックがあればそれにこしたことはないのですが。 >> で、main() についても呼び出し側でなんらかの仮定があり、それに対応して main() 記述側で記述するわけです。 >> ※によりmain() 呼び出し側は main() の記述側で必要な引数がどうであれ、常に同じものがリンクされるといっていいと思います。 >> そうであれば、main(void) と書くのは、main() 呼び出し側の仮定と食い違う書き方をしているわけですね。 >主観を排除した 主観がふくまれていたからといって意見として劣るわけではありますまい。そもそも主観・客観ってなんですか?
430 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 06:49:01 ] >そもそも主観・客観ってなんですか? バカじゃねぇの?
431 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 06:54:28 ] コンパイラは int main(void) を見つけたときと int main(int argc, char* argv[]) を見つけたときで スタートアップルーチンを自由に変えることが可能。
432 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 06:57:56 ] >>429 君が略した部分を飛ばして読むとそう読めるね。 なんて都合のいい引用の仕方。ふう。
433 名前:デフォルトの名無しさん [2008/11/20(木) 10:25:35 ] >>427 スレタイ読めないの? 初心者お断りだよ
434 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 10:59:56 ] main() の呼び出しが通常の関数呼び出しと同じだと思いこんでるのが間違いなんだな。
435 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 12:02:00 ] >>429 > 移植性をもたせることと int main(void) の表記とどのような関係があるのでしょうか? main() の引数リストについて移植性を保証できる表記を定めることに意味があるということ。 スタートアップからの呼び出し方法が自由だからといって main() の引数リストについて 何の規定もおかないでいると、移植性を保証することができない。 そして引数無しと2引数のものが移植性を保証できるものとして選ばれた。引数無しの ものの記法については >413 のとおり。
436 名前:デフォルトの名無しさん [2008/11/20(木) 17:21:26 ] >>422 それが本当は正道なはずだな
437 名前:デフォルトの名無しさん [2008/11/20(木) 18:47:05 ] test
438 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 19:17:09 ] >>434 全くだ。 そこは既にCの規格の範疇外の話だ。
439 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:22:24 ] >>431 確かにそのような手はあると思います。完全にstdcall なコンパイラならそうするしかないでしょう。 >> pc11.2ch.net/test/read.cgi/tech/1225320579/951 >>399 >>408
440 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:23:55 ] >>432 え?ether A or B の B を略しただけですが? B を略するかしないかで大きく意味が変わる文章なんですか?
441 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:24:28 ] >>433 どこが初心者だと感じたのか、詳細を記述いただければ幸いです。
442 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:31:37 ] >>435 移植性を保障するためにある一定の枠組みを定めておくところについては同意いたします。しかし、 私見では、 int main(int, char **) のみで十分と思われるのですが、あえて int main(void) を規定した意味については、どう考えておられるのでしょうか。 皆さんと私との意見の違いは、この部分にあると考えておりますので、差し支えなければ教えてください。 stdcall/cdecl あるいは別の呼び出し規約も視野にいれて規定されたのであれば、私としても依存はありません。 >>pc11.2ch.net/test/read.cgi/tech/1225320579/951
443 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:32:08 ] >>436 確かに同意いたします。 pc11.2ch.net/test/read.cgi/tech/1225320579/951
444 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:33:31 ] >>438 ん?main() といえども、他の関数と同じ、というのがもともとの心なのでは? 単にスタートアップコードから呼ばれる、というだけで。 #main() を recursive call するのは、違反でしたっけ?
445 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:36:31 ] >>430 つja.wikipedia.org/wiki/%E3%83%AB%E3%83%8D%E3%83%BB%E3%83%87%E3%82%AB%E3%83%AB%E3%83%88
446 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:44:05 ] >>400 are not compatible with the types of the parameters を略するなよ。おまえ、構文が読み取れてないだろ。
447 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:52:52 ] >>444 再帰しようが、別にそのプログラム中でつじつまが合っていれば問題なかろう。
448 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:54:43 ] >>442 引数使わない時にまで引数書くのめんどくせーじゃん。
449 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:56:29 ] そもそも何で呼び出し規約が関係するんだよ・・・。 最悪スタートアップルーチンを main によって変えれば済むだけの話じゃん。
450 名前:429 mailto:sage [2008/11/20(木) 21:57:52 ] >>446 私は、元の引用文を If 1) the function is defined with a type that includes a prototype, and 2) either 2.a) the prototype ends with an ellipsis (, ...) or 2.b) the types of the arguments after promotion are not compatible with the types of the parameters, the behavior is undefined. と考えましたが間違っているのでしょうか? 差し支えなければ、あなたの解釈を教えてください。
451 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:59:48 ] >>449 だからそれはすでに述べられ済み。 pc11.2ch.net/test/read.cgi/tech/1225320579/951
452 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:06:24 ] >>449 呼び出し規約、具体的には stdcall と cdecl とではスタックを払うのが呼び出し側か呼び出され側にあるか、という違いがあります。 すなわち、呼び出し側で仮定した引数と呼び出され側で仮定した引数とが異なってもよいか、それとも完全に一致しなければならないか、という違いを意味します。 スタートアップコードが main() を呼ぶときにスタックに積む引数と、main() がスタックに積んであると仮定している引数とが一致しなくてもいいのか、それとも一致しなければならないか、ということです。 stdcall では main() がスタックを払うので、両者は一致しなければなりません。
453 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:08:01 ] >>448 その論法でいけば、引数がないときには int main() とすれば、もっと楽ではないでしょうか。
454 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:25:32 ] どうでもいいけどおまえら2chのレスをソースにするなよwww
455 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:32:51 ] 一体何を問題に従ってるのかさっぱりわからん
456 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:33:42 ] 読んでて混乱するから以前の自分の発言を話の前提にしたいならレス番を名前に入れろ
457 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:36:53 ] >>451 何度dat落ちしたスレのアドレスを張る気だ