- 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/ 【このスレ住人としての心得】 わざとスレ違いあるいはごく低レベルな質問を繰り返して 流れを妨害する荒らしがいます。適当に誘導して放置してください。
- 321 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:04:29 ]
- >>311
違う。 上手くいかない保証があるってことだ。
- 322 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:06:28 ]
- >>317
通常の整数定数0の全ビットが0であることも保証されていると記憶しているが。
- 323 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:11:35 ]
- 定数の全ビットが0でもメモリに記憶されたときもそうなるの?
- 324 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:10:15 ]
- >>321
上手くいかない保証って...、なんだそりゃ。
- 325 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:28:14 ]
- >>323
ならなかったらビット演算で死ねるだろ
- 326 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:22:05 ]
- メモリ上でどうなっていても演算の結果が正しければいいんだよ。
- 327 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:29:54 ]
- C で言う所のメモリ上のビット配列ってのは
整数型の変数でビット演算によって参照できる値だっしょ。
- 328 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:47:38 ]
- C89で、名前は同じで引数の有無や個数が異なるマクロを複数定義することって認められてたっけ?
つまり、 #define A 0 #define A(x) x
- 329 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:52:31 ]
- 前スレで話が出て、できるってことだったような
- 330 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:12:28 ]
- gcc でエラーになるけど。
- 331 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:14:47 ]
- >>329
情報d 前スレ見てきたところ、同じ名前のマクロを同時に複数定義することはできないと書いてあったわ。
- 332 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:53:16 ]
- >>331
ごめん完璧まちがって記憶してたわ
- 333 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 16:17:14 ]
- ここにいる人って、アプリ屋?それともファーム屋?
なんか、話だけを見ると、アプリ屋のほうが多いような気が・・・
- 334 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 16:20:07 ]
- >>333 その区別に何の意味がある?区別のしかたもよくわからんしな。
- 335 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:53:26 ]
- まるでファーム屋が多くて然るべきだと言いたげに読めるのは、俺の日本語力が弱いせいですか?
- 336 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:12:04 ]
- スレ違いだと思う
- 337 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:18:53 ]
- ファーム屋(笑)
- 338 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:21:21 ]
- マ板でやれ
- 339 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:42:49 ]
- 俺はいわゆるファーム屋だが、
アプリ屋>>>>>ファーム屋 という印象がある。 はっきりいって、組込みソフト開発者はC言語と少しのハードウェア知識があれば、 あとは、仕様理解で仕事ができる。 様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。
- 340 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:34:39 ]
- 組み込み系のスレあたりを見てる印象だと、
組み込み屋には実装至上主義で、仕様ナニソレ、という雰囲気がある。 このスレにいるのは、なんちゃってであっても自分で処理系を書いたり したことがあるような、アプリよりはシステム寄りの人が多いんでは?
- 341 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:19:06 ]
- そりゃ偏見だ。
アプリ屋だろうがファーム屋だろうが底辺を見ればやっぱり底辺。 上をみればちゃんとしたひとも居る。 ただ、ちゃんとしたアプリ屋がシステム方面に行ってしまうのと同様に ちゃんとしたファーム屋はハードに行っちゃう事が多い。
- 342 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:33:49 ]
- 最近組み込みは年々ハードが高性能化、開発サイクルの短期化で、
少人数の職人的な開発者での開発は限界に来てますよ これからはアプリに近い開発方法論でやっていこうという欧米の流れ
- 343 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:49:36 ]
- >>339
> 様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。 新しい技術って Ajax とか Web 2.0 とかのこと? まあ、そう言う新しい言葉を理解するのも技術力のひとつではあるが。
- 344 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:12:15 ]
- …(^^;;
- 345 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:54:00 ]
- >様々な新しい技術を吸収し、
訳:新しくリリースされたアプリの使い方を覚えて、
- 346 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:38:00 ]
- アプリ屋の俺から言わせてもらえば、
アプリ屋→頭ゆるゆるで使えない奴が多い ファーム屋→頭かたすぎて使えない奴が多い
- 347 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 22:09:04 ]
- 自称技術者の93.2%は使えないから、そんなもんhだろう。
- 348 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 14:15:43 ]
- int a = 3; { int a = a; printf( "%d", a ); }
このとき表示される数字は 3 ですか?それとも不定ですか? JIS X 3010-1993 を少し読んだんですが分かりませんでした。
- 349 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 14:22:43 ]
- >>348
規格を見ずに gcc でテストしてみたところ 2147344384 と出力された
- 350 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 14:47:43 ]
- >>349
規格的には不定だよ. {} の中では新たなスコープが有効になるので {} 内の a が 宣言された瞬間に {} 外の a は shadow される # 言い方が厳密じゃないんだけど、言いたいこと分かってね Lisp 系言語の (let ((a 3)) (let ((a a)) (???? a))) ==> (let ((a 3)) (lambda (a) (??? a)) a) みたいな物を, 求めてはいけない
- 351 名前:349 (>>348 じゃないよ) mailto:sage [2008/08/06(水) 14:56:08 ]
- >>350
こういうのはOKですか? int a = 3; { int b = a; int a = b; printf( "a=%d b=%d", a, b ); }
- 352 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 15:01:52 ]
- >>351 いや、だから…
言い方が悪かったのかorz {} 外の名前が {} 内で宣言されたら shadow される 処理系によっては「{} 外の a」が意味をなす場合もあるかも知れないが 可搬なプログラムを書こうと思ったら、その事実に依存してはならない
- 353 名前:349 mailto:sage [2008/08/06(水) 15:07:08 ]
- >>352
規格では変数の宣言順序に関係なく 同一スコープ内で同名の変数が現れた場合には 外側の変数は見えなくなる だから >>351 は次のようにしないと動作の保証ができないということですね int a = 3; { int b = a; { int a = b; printf( "a=%d b=%d", a, b ); } }
- 354 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 16:13:40 ]
- JIS X 3010-1993 には以下のように書いてあるけどこれからは判断できなかった。
6.1.2.1 識別子の有効範囲 識別子は、有効範囲(scope)と呼ぶプログラムテキストの範囲にあるときだけ、可視(visible) (すなわち、使用可能)とする。有効範囲は、関数、ファイル、ブロック、及び関数原型の4種類とする。 識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、 その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって 終了する。 字句的に同一な識別子のより外側の宣言が同一の名前空間にある場合、外側の宣言は現在の 有効範囲が終了するまで不可視となり、その後再び可視となる。 二つの識別子は、有効範囲が同じ場所で終わる場合、そしてその場合に限り同じ有効範囲を持つ。
- 355 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 16:48:27 ]
- そうか?
はっきり書いてあると思うんだが。
- 356 名前:349 mailto:sage [2008/08/06(水) 23:17:37 ]
- >>354 を読んで解釈のひとつとして
int a, *p=&a; // これは OK int *q=&b, b; // これは NG ということは有効範囲とは変数の宣言順序によって変化するのではないか? >>351 の int b=a; の時点ではブロック内で変数 a が未定義であるため 外側の a が可視だから動作が保障されるのでは?
- 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) を呼び出すことは可能です。リンカもエラーは吐きません。
|

|