[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 17:48 / Filesize : 178 KB / Number-of Response : 821
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者お断り】ガチ規格準拠C専用スレ Part133



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落ちしたスレのアドレスを張る気だ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<178KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef