【初心者お断り】ガチ ..
331:デフォルトの名無しさん
08/06/08 15:14:47
>>329
情報d
前スレ見てきたところ、同じ名前のマクロを同時に複数定義することはできないと書いてあったわ。
332:デフォルトの名無しさん
08/06/08 15:53:16
>>331
ごめん完璧まちがって記憶してたわ
333:デフォルトの名無しさん
08/06/08 16:17:14
ここにいる人って、アプリ屋?それともファーム屋?
なんか、話だけを見ると、アプリ屋のほうが多いような気が・・・
334:デフォルトの名無しさん
08/06/08 16:20:07
>>333 その区別に何の意味がある?区別のしかたもよくわからんしな。
335:デフォルトの名無しさん
08/06/08 17:53:26
まるでファーム屋が多くて然るべきだと言いたげに読めるのは、俺の日本語力が弱いせいですか?
336:デフォルトの名無しさん
08/06/08 18:12:04
スレ違いだと思う
337:デフォルトの名無しさん
08/06/08 19:18:53
ファーム屋(笑)
338:デフォルトの名無しさん
08/06/08 19:21:21
マ板でやれ
339:デフォルトの名無しさん
08/06/08 19:42:49
俺はいわゆるファーム屋だが、
アプリ屋>>>>>ファーム屋
という印象がある。
はっきりいって、組込みソフト開発者はC言語と少しのハードウェア知識があれば、
あとは、仕様理解で仕事ができる。
様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。
340:デフォルトの名無しさん
08/06/08 20:34:39
組み込み系のスレあたりを見てる印象だと、
組み込み屋には実装至上主義で、仕様ナニソレ、という雰囲気がある。
このスレにいるのは、なんちゃってであっても自分で処理系を書いたり
したことがあるような、アプリよりはシステム寄りの人が多いんでは?
341:デフォルトの名無しさん
08/06/08 21:19:06
そりゃ偏見だ。
アプリ屋だろうがファーム屋だろうが底辺を見ればやっぱり底辺。
上をみればちゃんとしたひとも居る。
ただ、ちゃんとしたアプリ屋がシステム方面に行ってしまうのと同様に
ちゃんとしたファーム屋はハードに行っちゃう事が多い。
342:デフォルトの名無しさん
08/06/08 21:33:49
最近組み込みは年々ハードが高性能化、開発サイクルの短期化で、
少人数の職人的な開発者での開発は限界に来てますよ
これからはアプリに近い開発方法論でやっていこうという欧米の流れ
343:デフォルトの名無しさん
08/06/08 22:49:36
>>339
> 様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。
新しい技術って Ajax とか Web 2.0 とかのこと?
まあ、そう言う新しい言葉を理解するのも技術力のひとつではあるが。
344:デフォルトの名無しさん
08/06/08 23:12:15
…(^^;;
345:デフォルトの名無しさん
08/06/08 23:54:00
>様々な新しい技術を吸収し、
訳:新しくリリースされたアプリの使い方を覚えて、
346:デフォルトの名無しさん
08/07/02 21:38:00
アプリ屋の俺から言わせてもらえば、
アプリ屋→頭ゆるゆるで使えない奴が多い
ファーム屋→頭かたすぎて使えない奴が多い
347:デフォルトの名無しさん
08/07/02 22:09:04
自称技術者の93.2%は使えないから、そんなもんhだろう。
348:デフォルトの名無しさん
08/08/06 14:15:43
int a = 3; { int a = a; printf( "%d", a ); }
このとき表示される数字は 3 ですか?それとも不定ですか?
JIS X 3010-1993 を少し読んだんですが分かりませんでした。
349:デフォルトの名無しさん
08/08/06 14:22:43
>>348
規格を見ずに gcc でテストしてみたところ
2147344384
と出力された
350:デフォルトの名無しさん
08/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 じゃないよ)
08/08/06 14:56:08
>>350
こういうのはOKですか?
int a = 3; { int b = a; int a = b; printf( "a=%d b=%d", a, b ); }
352:デフォルトの名無しさん
08/08/06 15:01:52
>>351 いや、だから…
言い方が悪かったのかorz
{} 外の名前が {} 内で宣言されたら shadow される
処理系によっては「{} 外の a」が意味をなす場合もあるかも知れないが
可搬なプログラムを書こうと思ったら、その事実に依存してはならない
353:349
08/08/06 15:07:08
>>352
規格では変数の宣言順序に関係なく
同一スコープ内で同名の変数が現れた場合には
外側の変数は見えなくなる
だから >>351 は次のようにしないと動作の保証ができないということですね
int a = 3; { int b = a; { int a = b; printf( "a=%d b=%d", a, b ); } }
354:デフォルトの名無しさん
08/08/06 16:13:40
JIS X 3010-1993 には以下のように書いてあるけどこれからは判断できなかった。
6.1.2.1 識別子の有効範囲
識別子は、有効範囲(scope)と呼ぶプログラムテキストの範囲にあるときだけ、可視(visible)
(すなわち、使用可能)とする。有効範囲は、関数、ファイル、ブロック、及び関数原型の4種類とする。
識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、
その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって
終了する。
字句的に同一な識別子のより外側の宣言が同一の名前空間にある場合、外側の宣言は現在の
有効範囲が終了するまで不可視となり、その後再び可視となる。
二つの識別子は、有効範囲が同じ場所で終わる場合、そしてその場合に限り同じ有効範囲を持つ。
355:デフォルトの名無しさん
08/08/06 16:48:27
そうか?
はっきり書いてあると思うんだが。
356:349
08/08/06 23:17:37
>>354 を読んで解釈のひとつとして
int a, *p=&a; // これは OK
int *q=&b, b; // これは NG
ということは有効範囲とは変数の宣言順序によって変化するのではないか?
>>351 の int b=a; の時点ではブロック内で変数 a が未定義であるため
外側の a が可視だから動作が保障されるのでは?
357:デフォルトの名無しさん
08/08/06 23:58:57
いや、shadowされているが未定義である状態。
358:349
08/08/07 00:23:41
>>357
>>354 のこの部分
>識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、
>その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって
>終了する。
これは有効範囲の終わりについてのみ言及しており、
変数自体は変数宣言以降から有効になるのではないの?
359:デフォルトの名無しさん
08/08/07 00:29:19
だからそういっているんだが。
360:349
08/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
08/08/07 01:15:04
>>360 の
int *p=&a;
の行が規格としては
1.エラーになるべきか
2.未定義(実装依存、鼻から悪魔)か
が知りたいのですが
>>357 さんは 2 ということでしょうか?
362:349
08/08/07 01:16:35
>>361 に追記
3.定義済み (>>360 のコードは規格に沿っている)
363:デフォルトの名無しさん
08/08/07 01:17:28
ISO の、ダウンロードできるドラフトでは >354 が引用した部分の直後にスコープの開始位置に
ついての説明があった。それによると、変数名のスコープが始まるのは変数宣言内の変数名の
直後。
ってことで >351 は OK 。
364:349
08/08/07 01:20:49
>>363
ありがとうございます
スッキリしました
これでゆっくり眠れます
365:デフォルトの名無しさん
08/10/16 08:59:54
真偽値は非ゼロとゼロ、というのは環境依存でしょうか
それとも規格上間違いなく非ゼロが真、ゼロが偽でしょうか
366:デフォルトの名無しさん
08/10/16 10:34:25
規格上決まってる
367:デフォルトの名無しさん
08/10/16 12:29:25
>366
ありがとうございます
368:デフォルトの名無しさん
08/11/16 23:28:03
スレリンク(tech板:951-番)
int main(){/* ... */}が標準準拠かどうか揉めてます
識者の見解をお願いします
369:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/17 00:10:42
Cでは基本的に () と (void) は異なるが、
関数定義においては同じとされていたはず。
GCC ではそうなってなかった気はするが・・・。
371:デフォルトの名無しさん
08/11/17 00:40:22
そもそも組込みには必ずしもmain()はない・・・というのはここでは禁句かな?
しかし、いくらC言語の規格に準拠していても、MISRAに準拠していないと言うことで
プログラムの作りかえをさせられるのはウザイ・・・
逸脱手順を書くのもウザイ・・・
372:デフォルトの名無しさん
08/11/17 22:48:37
>>368
言いだしっぺです。
int main() が標準準拠かどうか?でもめているのではなく、(そういうことならいうまでもなく標準準拠に決まっています。)
int main(void) を標準としたのは馬鹿じゃないの?ということです。
昔 fj でもめたのを受け売りしただけですね、はい。
373:デフォルトの名無しさん
08/11/17 22:53:25
>>372
main() は K&R 準拠だろ
374:デフォルトの名無しさん
08/11/17 23:32:05
>>371
ホスト環境とスタンドなんとか環境ですね
375:デフォルトの名無しさん
08/11/19 03:21:32
>>372
int main(void) 以外の何を標準にするべきで、そうすると何がうれしいと思ってるの?
376:デフォルトの名無しさん
08/11/19 05:04:56
>>375
int main(void) は削除するのがいいでしょうね。
int main() という書き方が現在でも有効であるのに、なぜわざわざ int main(void) というセンスのない書き方をまかり通すのか理解に苦しみます。
そのこころは、つスレリンク(tech板:962番)
377:デフォルトの名無しさん
08/11/19 08:41:44
こちらは将来的に削除される予定
> int main()
378:デフォルトの名無しさん
08/11/19 11:05:40
>>376
リンクされたスレは既に dat 落ちで見れない。
379:デフォルトの名無しさん
08/11/19 12:25:34
>>376
センスがないって、どのように?
380:デフォルトの名無しさん
08/11/19 18:55:51
(void)にセンスがないというのは理解できる。
空の()で引数がないことを表すことにしたC++の英断は素晴らしい。
381:デフォルトの名無しさん
08/11/19 18:58:42
Cの方は過去のしがらみもあったしな
382:デフォルトの名無しさん
08/11/19 20:11:19
くだらねぇぇぇぇ
383:デフォルトの名無しさん
08/11/19 20:17:17
引数チェックのない時代の名残だからな。
384:デフォルトの名無しさん
08/11/19 21:03:20
>>379
呼び出し側は引数の有無にかかわらず同じだったとしたら、呼び出し側の実際と違う宣言をなんの躊躇もなく記述するところ。
385:デフォルトの名無しさん
08/11/19 21:07:22
>>384
main の呼び出し側はスタートアップ関数であって、
スタートアップ関数はコンパイラが提供するものだろ・・・。
386:デフォルトの名無しさん
08/11/19 22:13:58
>>384
呼び出し側の実際の宣言は何だと思っている?
387:デフォルトの名無しさん
08/11/19 22:52:01
ソースコード側でC言語の管轄外の世界に勝手な仮定置いちゃダメだろ
標準的に考えて
388:デフォルトの名無しさん
08/11/19 23:08:45
>>387
プログラム開始処理(program startup)が main を呼ぶ事は
5.1.2.2.1 プログラム開始処理 に規定されている。
389:デフォルトの名無しさん
08/11/19 23:09:40
きっとOSが「いんとめいんかっことじかっこ…」とかコマンド打ち込んでると思ってるんだろう
390:デフォルトの名無しさん
08/11/19 23:14:16
>>388
プログラム開始処理がmainを呼ぶ時に引数をチェックしないなんて規定されてたっけ
391:デフォルトの名無しさん
08/11/19 23:18:19
>>390
多分お前の話したい奴は別の奴だ。
392:デフォルトの名無しさん
08/11/19 23:24:13
スタートアップ処理はコンパイラが用意するから
main がどうなっていようと良きに計らってくれるっしょ。
393:デフォルトの名無しさん
08/11/19 23:58:18
main関数の定義でint main()と書いてるんだから
引数なし以外ありえない。
関数宣言での引数省略と勘違いしてるんだろうね
394:デフォルトの名無しさん
08/11/20 00:07:12
>>385
スタートアップ関数は引数の有無にかかわらず同じだったとしたら、スタートアップ側の実際の違う宣言を躊躇なく記述することに疑問を感じています。
395:デフォルトの名無しさん
08/11/20 00:10:41
>>386
実際のところ、
int main(int argc, char **argv, char **env)
でしょうか。私のところの某処理系では環境変数がコンパイル時スタックをつぶしてしまうので可能なときは再コンパイルしていました。
これってヘッダをさわっただけではどうにもならなかったですよね。
396:デフォルトの名無しさん
08/11/20 00:11:12
>>387
だから int main() なのでは?
397:デフォルトの名無しさん
08/11/20 00:12:11
>>389
某処理系のfork()やexec*()の存在くらいは知っています。
398:デフォルトの名無しさん
08/11/20 00:12:42
>>392
それはそうですね。
399:デフォルトの名無しさん
08/11/20 00:14:51
>>393
それはそうですね。
コンパイラ側が勝手に stdcall をデフォルトとしている世界であれば、逆に int main(void) でないと困るのかもしれません。
んー ms-pascal?
400:デフォルトの名無しさん
08/11/20 00:29:00
>>390
プログラム開始処理が main() のために引数を整えている、と理解していますが、実際のところは誰がしているのでしょうか?
401:デフォルトの名無しさん
08/11/20 00:33:38
>>400
ご明察の通り、スタートアップルーチンがお膳立てします。
402:デフォルトの名無しさん
08/11/20 00:39:02
osとcrt
403:デフォルトの名無しさん
08/11/20 00:41:42
>>376
実は main は関係無くて、引数無しの関数の引数リストが void なのが不満なだけなのか?
404:デフォルトの名無しさん
08/11/20 00:42:51
不満なら書かなきゃいいだけの話では?
405:デフォルトの名無しさん
08/11/20 00:43:24
>>394
>スタートアップ関数は引数の有無にかかわらず同じだったとしたら、
その仮定がおかしい
406:デフォルトの名無しさん
08/11/20 00:47:08
実際同じじゃね?
呼び出し側で積んだ引き数は、呼ばれた側が無視しても全く問題ないわけだし。
例えばint func() {return 0;}という関数を宣言なしでfunc(0)と呼ぶときと事情は変わらない。
407:デフォルトの名無しさん
08/11/20 00:51:44
>>402
os? shell ではないのですか?
というか shell と crt との役割分担は?あー ms-dos以外の場合で、てことで。
408:デフォルトの名無しさん
08/11/20 00:53:54
>>405
ん、たしかに stdcall がデフォルトのコンパイラがあったとしたら、その場合スタートアップ関数は int main(int c, char **v) と int main(void) とでは異なるでしょうね。
409:デフォルトの名無しさん
08/11/20 00:54:44
>>403
ん、そです。
410:デフォルトの名無しさん
08/11/20 00:55:48
>>409
すると、>406のようなfuncも気に入らないと。
>>408
>406
411:デフォルトの名無しさん
08/11/20 01:00:18
>>410
int func(void) {return 0;}と書いておきながら、func(0)と呼ぶのが気に入らないだけなんですが。
412:407
08/11/20 01:01:11
>>402
shell の末尾は exec*() でしたね。失礼しました。
413:デフォルトの名無しさん
08/11/20 01:06:17
>>409
古い(規格化以前?の) C では、引数リストが空の関数宣言は引数の数や個数を指定せずに
関数を宣言するものとなっていた。規格化にあたってそういった過去のコードを不正としないように
配慮した。そういうことだと思う。規格を決めた人が馬鹿だったわけじゃないでしょ。
414:デフォルトの名無しさん
08/11/20 01:30:17
>>413
そうではなくて、
func() に必要な引数はないけれども、func(0, 1, 2, 3 ... ) と呼び出さざるを得ない状況で
func() の宣言をどうするか?
という問題です。
このとき、int func(void) と宣言するのは、
すっごくやです。
415:デフォルトの名無しさん
08/11/20 01:41:31
int func(...);
416:デフォルトの名無しさん
08/11/20 01:45:50
>>415
%gcc test.c
test.c:3 error: ISO C requires a named argument before ...
417:408
08/11/20 02:18:24
>>410
> >>408
> >406
ん?stdcall はreturn時に呼び出され側でスタックを払うから、呼び出し側は呼び出され側の引数を完全無欠に知っておかなければならないかと。
418:デフォルトの名無しさん
08/11/20 02:53:28
>すっごくやです。
し ら ね え よ
419:デフォルトの名無しさん
08/11/20 03:10:51
>>414
> func() に必要な引数はないけれども、func(0, 1, 2, 3 ... ) と呼び出さざるを得ない状況で
>416 のとおり、そういうことはできないことになっている。
420:デフォルトの名無しさん
08/11/20 03:14:04
>>418
論理的な思考の根源には、ある種の好き嫌いの視点からの判断が含まれることも多々あるのですが、
お気に召さないのであれば、いいなおしましょうか。
「int main(void)は、main() の呼び出し側に思いを馳せていない、という点で、規約としては問題があるかと思います。」
421:デフォルトの名無しさん
08/11/20 03:21:36
>>419
いいえ、>>416 は、
不定長引数の場合はすくなくとも一つの引数には名前がついていなければならない、と述べているにすぎません。
コンパイル単位が別であれば、
int func(void) { return 0; }
に対して、
func(0, 1, 2, 3, 4, 5, 6, 7)
を呼び出すことは可能です。リンカもエラーは吐きません。
422:デフォルトの名無しさん
08/11/20 03:30:19
>>420
なら、main(void)用とmain(int argc, char **argv)用のスタートアップルーチンを用意して、
プログラムに合うように選択する処理系があったらint main(void)でも構わないのか?
……自分で書いていて詭弁のガイドラインに抵触するような気がしてきた。
423:デフォルトの名無しさん
08/11/20 03:33:37
>>421
あるコンパイル単位では int func(int a, ...) と宣言して、別のコンパイル単位で
int func(void) で定義するってこと?
それなら未定義動作だよ。コンパイルできてもリンクできても議論に値しない。
424:デフォルトの名無しさん
08/11/20 04:03:29
>>423
正確には、あるコンパイル単位では int func(void) と定義しておいて、
別のコンパイル単位から func(0, 1, 2, 3) と呼び出します。
未定義であることの記述があれば教えてください。
というより、cdecl と stdcall の話は処理系依存といえますから、この手の話が規約に載ることもないでしょう。
でも stdcall ならば可変長引数は困難ですし、でも cdecl/stdcall の話が可変長引数に絡むし、そして可変長引数は定義されていますし、
実装によっては不可能な仕様というものでも定義されているのは、どういうことなのでしょうか?
それはそうと、ほとんどのコンパイラでは、スタートアップと main() とのリンクは、上述のようになっているのですが‥‥‥。
425:デフォルトの名無しさん
08/11/20 04:04:22
>>422
そういうことになります。お目にかかったことはありませんが、完全無欠のstdcall仕様のコンパイラがあれば。
426:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/20 04:25:55
>>426
なるほど。
これを見る限り、可変長引数も「実は未定義」なんでしょうか?んー、prnitf() はどうなるのでしょうか?
>スタートアップと main() とのリンクについては処理系ごとに好きにすればいい話
それでは、なおさら、int main(void) を標準的な記法として盛り込むの問題かと。int main(void) は現実から乖離しています。いらない子です。
428:デフォルトの名無しさん
08/11/20 04:35:26
>>427
可変長引数は ... を含むプロトタイプ付き関数として定義されている。
main() とのリンク方法が処理系依存でも、処理系に食わせるプログラム自体は
移植性を持つ必要がある。全然関係ない話。
main() の話がしたければ >>375 の質問に対して主観を排除した答えを出せ。
429:デフォルトの名無しさん
08/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) の表記とどのような関係があるのでしょうか?
>主観を排除した
ではスレリンク(tech板:962番)を再掲します。
>> c でよく採用された実装では、呼び出され側のコードは、呼び出し側の引数の個数や種類に依存しない、というもの。....※
>> 個々の関数は翻訳単位を別にとることが可能ですよね。無論、呼び出し側・呼び出され側の引数のチェックがあればそれにこしたことはないのですが。
>> で、main() についても呼び出し側でなんらかの仮定があり、それに対応して main() 記述側で記述するわけです。
>> ※によりmain() 呼び出し側は main() の記述側で必要な引数がどうであれ、常に同じものがリンクされるといっていいと思います。
>> そうであれば、main(void) と書くのは、main() 呼び出し側の仮定と食い違う書き方をしているわけですね。
>主観を排除した
主観がふくまれていたからといって意見として劣るわけではありますまい。そもそも主観・客観ってなんですか?
430:デフォルトの名無しさん
08/11/20 06:49:01
>そもそも主観・客観ってなんですか?
バカじゃねぇの?
431:デフォルトの名無しさん
08/11/20 06:54:28
コンパイラは int main(void) を見つけたときと int main(int argc, char* argv[]) を見つけたときで
スタートアップルーチンを自由に変えることが可能。
432:デフォルトの名無しさん
08/11/20 06:57:56
>>429
君が略した部分を飛ばして読むとそう読めるね。
なんて都合のいい引用の仕方。ふう。
433:デフォルトの名無しさん
08/11/20 10:25:35
>>427
スレタイ読めないの?
初心者お断りだよ
434:デフォルトの名無しさん
08/11/20 10:59:56
main() の呼び出しが通常の関数呼び出しと同じだと思いこんでるのが間違いなんだな。
435:デフォルトの名無しさん
08/11/20 12:02:00
>>429
> 移植性をもたせることと int main(void) の表記とどのような関係があるのでしょうか?
main() の引数リストについて移植性を保証できる表記を定めることに意味があるということ。
スタートアップからの呼び出し方法が自由だからといって main() の引数リストについて
何の規定もおかないでいると、移植性を保証することができない。
そして引数無しと2引数のものが移植性を保証できるものとして選ばれた。引数無しの
ものの記法については >413 のとおり。
436:デフォルトの名無しさん
08/11/20 17:21:26
>>422
それが本当は正道なはずだな
437:デフォルトの名無しさん
08/11/20 18:47:05
test
438:デフォルトの名無しさん
08/11/20 19:17:09
>>434
全くだ。
そこは既にCの規格の範疇外の話だ。
439:デフォルトの名無しさん
08/11/20 21:22:24
>>431
確かにそのような手はあると思います。完全にstdcall なコンパイラならそうするしかないでしょう。
>> スレリンク(tech板:951番)
>>399 >>408
440:デフォルトの名無しさん
08/11/20 21:23:55
>>432
え?ether A or B の B を略しただけですが?
B を略するかしないかで大きく意味が変わる文章なんですか?
441:デフォルトの名無しさん
08/11/20 21:24:28
>>433
どこが初心者だと感じたのか、詳細を記述いただければ幸いです。
442:デフォルトの名無しさん
08/11/20 21:31:37
>>435
移植性を保障するためにある一定の枠組みを定めておくところについては同意いたします。しかし、
私見では、
int main(int, char **)
のみで十分と思われるのですが、あえて
int main(void)
を規定した意味については、どう考えておられるのでしょうか。
皆さんと私との意見の違いは、この部分にあると考えておりますので、差し支えなければ教えてください。
stdcall/cdecl あるいは別の呼び出し規約も視野にいれて規定されたのであれば、私としても依存はありません。
>>スレリンク(tech板:951番)
443:デフォルトの名無しさん
08/11/20 21:32:08
>>436
確かに同意いたします。
スレリンク(tech板:951番)
444:デフォルトの名無しさん
08/11/20 21:33:31
>>438
ん?main() といえども、他の関数と同じ、というのがもともとの心なのでは?
単にスタートアップコードから呼ばれる、というだけで。
#main() を recursive call するのは、違反でしたっけ?
445:デフォルトの名無しさん
08/11/20 21:36:31
>>430
つWikipedia項目リンク
446:デフォルトの名無しさん
08/11/20 21:44:05
>>400
are not compatible with the types of the parameters
を略するなよ。おまえ、構文が読み取れてないだろ。
447:デフォルトの名無しさん
08/11/20 21:52:52
>>444
再帰しようが、別にそのプログラム中でつじつまが合っていれば問題なかろう。
448:デフォルトの名無しさん
08/11/20 21:54:43
>>442
引数使わない時にまで引数書くのめんどくせーじゃん。
449:デフォルトの名無しさん
08/11/20 21:56:29
そもそも何で呼び出し規約が関係するんだよ・・・。
最悪スタートアップルーチンを main によって変えれば済むだけの話じゃん。
450:429
08/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:デフォルトの名無しさん
08/11/20 21:59:48
>>449
だからそれはすでに述べられ済み。
スレリンク(tech板:951番)
452:デフォルトの名無しさん
08/11/20 22:06:24
>>449
呼び出し規約、具体的には stdcall と cdecl とではスタックを払うのが呼び出し側か呼び出され側にあるか、という違いがあります。
すなわち、呼び出し側で仮定した引数と呼び出され側で仮定した引数とが異なってもよいか、それとも完全に一致しなければならないか、という違いを意味します。
スタートアップコードが main() を呼ぶときにスタックに積む引数と、main() がスタックに積んであると仮定している引数とが一致しなくてもいいのか、それとも一致しなければならないか、ということです。
stdcall では main() がスタックを払うので、両者は一致しなければなりません。
453:デフォルトの名無しさん
08/11/20 22:08:01
>>448
その論法でいけば、引数がないときには
int main()
とすれば、もっと楽ではないでしょうか。
454:デフォルトの名無しさん
08/11/20 22:25:32
どうでもいいけどおまえら2chのレスをソースにするなよwww
455:デフォルトの名無しさん
08/11/20 22:32:51
一体何を問題に従ってるのかさっぱりわからん
456:デフォルトの名無しさん
08/11/20 22:33:42
読んでて混乱するから以前の自分の発言を話の前提にしたいならレス番を名前に入れろ
457:デフォルトの名無しさん
08/11/20 22:36:53
>>451
何度dat落ちしたスレのアドレスを張る気だ
458:デフォルトの名無しさん
08/11/20 22:47:16
頑張って読んだ
要するにお前の主張は
「int main(void)って書くの気持ち悪い!気持ち悪いよねお前らもそう思うだろ!!」
だな?
じゃあそれに対する答えは
「規格が許してるんだから書きたいやつが書いて何も問題ねえしお前の好みなんか知るかボケ」
だよ
459:デフォルトの名無しさん
08/11/20 23:00:06
呼び出し規約とか関係ねぇから
460:デフォルトの名無しさん
08/11/20 23:02:42
>>452
main を見てスタートアップコードを作るんだろ・・・。
何で先にスタートアップコードがあるんだよ。
バカかよ。
461:デフォルトの名無しさん
08/11/20 23:03:55
voidって空って意味だから、int main(void)って書いて
引数リストが空だってことを明示している方がわかりやすい。
int main()だと、引数リストがvoidなのかdon't careなのか不明確。
int main(void)が気持ち悪いってやつは英語のセンスがないんだろうね
462:デフォルトの名無しさん
08/11/20 23:05:03
>>453
規格上はそれで問題ない。
関数定義での () は (void) と規格上は等価だから
(関数原型ではもちろん () と (void) は別だが)。
でも、その規格に準拠していないコンパイラがあるから
已む無く (void) をつけているに過ぎない。
463:デフォルトの名無しさん
08/11/20 23:10:15
>>457
dat落ちしてるなら内容も貼って欲しいよね。
スレリンク(tech板:951番)
951 名前:デフォルトの名無しさん[sage] 投稿日:2008/11/16(日) 21:46:28
>>949
個人的には、int main(void); という書き方に不満があります。私なら int main(); とします。でも、cdecl でも stdcall でも通用するようにしたいのでしょうけれども。
464:デフォルトの名無しさん
08/11/20 23:11:25
では採決します。
int main(void)が気持ち悪いと思う人いますか?
465:デフォルトの名無しさん
08/11/20 23:12:16
気持ち悪くないが C++ やってると面倒くさいとは思う。
466:デフォルトの名無しさん
08/11/20 23:12:49
>>456
発言したが私であることを特に問題にはしていないのですけれども。
467:デフォルトの名無しさん
08/11/20 23:13:20
>>457
それはあなたの事情であって私の知ったことではありません。
468:デフォルトの名無しさん
08/11/20 23:15:45
>>466
単発のレス読んでると何が言いたいかワカンネってんだよ
469:デフォルトの名無しさん
08/11/20 23:17:42
>>458
main() に与えられる引数を使用しない場合に int main(void) と特に規定したのはどういう理由だろうか?
という点です。その理由が基本的によくわからない(ある程度の推測はあるにしても)し、普通の関数ではそんなふうには書かないので、
これは問題ではないか、ということを問題にしています。
規格そのものを問題にしている以上、「規格が許しているんだから」は答えにならないのは自明なのですが。
470:デフォルトの名無しさん
08/11/20 23:17:53
>>468
あなたの理解力不足を人のせいにするのはやめてくれませんか?
471:デフォルトの名無しさん
08/11/20 23:19:14
>>469
普通の関数でも void 書くだろ・・・。
472:デフォルトの名無しさん
08/11/20 23:19:46
>>469
ダウト。
普通の関数でも引数リストでhoge(void)って使います。
473:デフォルトの名無しさん
08/11/20 23:20:14
>>460
いいえ、スタートアップコードがあって、main() がそれにリンクするのです。
スタートアップコードを使い分けるにしても、それは同じこと。
大体スタートアップコードを使い分けているコンパイラがありますか?
そんな処理系は printf() をはじめとする可変長引数の関数が一切使えないのではないかと。
474:デフォルトの名無しさん
08/11/20 23:20:19
>>469
,、‐ ''"  ̄ ``'' ‐- 、
/イハ/レ:::/V\∧ド\
/::^'´::::::::::::i、::::::::::::::::::::::::::::\
‐'7::::::::::::::::::::::::ハ:ハ::|ヽ:::;、::::::::::::丶
/::::::::::::::/!i::/|/ ! ヾ リハ:|;!、:::::::l
/´7::::::::::〃|!/_,,、 ,、==、、''`‐ly:::ト
/|;ィ:::::N,、‐'゛_,,.\ !"r‐、ヽ !;K
! |ハト〈 ,r''"゛ , ヽ゚,シ リイ)|
`y't ヽ' ,,ィァ //
! ぃ、 ト─=ニニ‐ノ 〃
`'' へ``'ー─‐‐'´, .イ
`i;、 / l
〉 ` ‐ ´ l`ヽ
/ ! レ' ヽ_
_,、‐7 i| i´ l `' ‐ 、_
,、-‐''"´ ノ,、-、 / 、,_ ,.、- {,ヘ '、_ `ヽ、_
/ i ,、イ ∨ l.j__,,、..-‐::-:;」,ハ、 '、` ‐、_ ,`ヽ
/ l ,、‐'´ // ',/!:::::::::;、--ァ' / `` ‐ `'7゛ ',
475:デフォルトの名無しさん
08/11/20 23:21:26
int foo(void)なんて喜んで書く人は、悪いけどプログラミングのセンスを疑いますよ
バカにしてるとさえ感じますね
コンパイラや保守者や、Cという言語に対しても
476:デフォルトの名無しさん
08/11/20 23:22:12
>>472
あなたとは仕事をしたくない
477:デフォルトの名無しさん
08/11/20 23:22:26
void 書かないと引数書き放題だろ・・・。
バカか、こいつ。
478:デフォルトの名無しさん
08/11/20 23:24:44
>>461
引数を指定するのに呼び出し側を考慮しないのはどうかと思います。
それに、スタートアップで引数をスタックに積んでいる以上、main() の場合は do not care のほうが適当かと。
>英語のセンスが
英語のセンスなど別にどうでもいいです。
479:デフォルトの名無しさん
08/11/20 23:25:17
>>463
恐縮です。
480:デフォルトの名無しさん
08/11/20 23:25:48
>>475
アマチュアの方ですか?
CはC++みたく引数までシグネチャーに含んでくれないので、
型チェックはコンパイル頼みになるのです。
引数なしの関数をチェックさせるために(void)って書くんですよ。
まぁあなたみたいに一人でオナニープログラム書いている人には
関係ないでしょうが。
481:デフォルトの名無しさん
08/11/20 23:26:38
>>473
使い分ける必要のある環境なら
main のあるソースをコンパイルする時に
自動的にそれに対応したスタートアップを追加するか、
あるいはリンカが main によってリンクするスタートアップコードを変えるか、
そういう実装になるはずだろう。
482:デフォルトの名無しさん
08/11/20 23:27:20
>>471
「普通の関数でも 引数指定部分のvoid は好まない」とは一言ももうしあげておりません。
483:デフォルトの名無しさん
08/11/20 23:27:37
>>478
まず、int main() { } の () は don't care ではなく void だ。規格上は。
484:デフォルトの名無しさん
08/11/20 23:27:46
>>478
>それに、スタートアップで引数をスタックに積んでいる以上、
>main() の場合は do not care のほうが適当かと。
ダウト。
引数をスタックに積むとは限らない。
処理系依存。
485:デフォルトの名無しさん
08/11/20 23:28:58
>>472
言葉が足りませんでしたね。
呼び出し側で引数を指定しているのに、コール先で引数なしとすることはないと思います。
これが呼び出し側:スタートアップ、コール先:main() であっても同じなのではないでしょうか?
486:デフォルトの名無しさん
08/11/20 23:29:22
>>485
ダウト。
常に呼び出し側で引数を指定しているとは限らない。
487:デフォルトの名無しさん
08/11/20 23:31:19
>>484
ん、広く範囲をとれば、それはそういうことになるとは思います。確かに引数をスタックに積むとはかぎりらないでしょうね。
488:デフォルトの名無しさん
08/11/20 23:31:22
型チェックってのは1つ以上の引数を渡した時に、間違った型として扱わないために必要なのであって
もともと引数取らない関数にとってはどうでもいいことです
だいたい引数取らない関数に引数なんか渡したら誰だって間違いと気付きます
ちなみにC++が引数なし関数までシグネチャに含むのはデフォルト引数があるからです
489:デフォルトの名無しさん
08/11/20 23:32:18
>>483
詳説を希望いたします。
490:デフォルトの名無しさん
08/11/20 23:32:50
>>485
>呼び出し側で引数を指定しているのに、
>コール先で引数なしとすることはないと思います。
ダウト。
それはあなたの思い込み。
言語仕様上そういうことが可能ならば、間違いは必ずおきます。
プロならばそれを回避しようとするのは当然。
491:デフォルトの名無しさん
08/11/20 23:32:53
>>488
コンパイラは間違いに気づきません。
コンパイラが気づかなかった事により、人間も気づかないかもしれません。
例えば引数の数を変えた時とか。
そもそも引数の数によって引数チェックが必要か必要ないかが変わることこそ気持ち悪い。
492:デフォルトの名無しさん
08/11/20 23:33:47
>>489
>>462
何度も同じ事を言わせるな。
493:デフォルトの名無しさん
08/11/20 23:33:56
引数をスタックに積まない実装など見たことがありません
今までに存在したとも思えないし、これから登場することも考えられません
(ネタやお遊びで作った実用性のない環境は知りませんよ)
規格の無意味な汎用性への配慮の産物がint main(void)という醜悪な構文なのです
494:デフォルトの名無しさん
08/11/20 23:34:04
>>488
>だいたい引数取らない関数に引数なんか渡したら誰だって間違いと気付きます
んー、コンパイル単位を別にとれば、問題なくコンパイル/リンク可能で、かつ、大概の環境では問題もないのですが。
495:デフォルトの名無しさん
08/11/20 23:35:04
>>488
>ちなみにC++が引数なし関数までシグネチャに
>含むのはデフォルト引数があるからです
ダウト。
C++にはオーバーロードがあるからです。
知ったかすんな
496:デフォルトの名無しさん
08/11/20 23:35:23
>>492
これは申し訳ない。調べておきます。
497:デフォルトの名無しさん
08/11/20 23:36:16
>>493
ヒント:ニンテンドーDS
498:デフォルトの名無しさん
08/11/20 23:36:57
>>493
レジスタ渡しとかも普通にするだろ。
499:デフォルトの名無しさん
08/11/20 23:37:06
>>491
そもそも間違って渡したから何だというのでしょう
引数に名前は付いてないので関数からは手出しできません
だから何かを壊すことはありません
せいぜい値渡しの無駄なコピーが何回か増えるだけです
型チェックのコストの方が高いという判断はありうることです
500:デフォルトの名無しさん
08/11/20 23:37:54
なんだか釣りにしか見えなくなってきたな
501:デフォルトの名無しさん
08/11/20 23:38:05
>>499
やっぱ引数欲しいや、って増やす事だってあるだろ。
その時に変な引数渡されるかもしれない。
502:デフォルトの名無しさん
08/11/20 23:38:59
>>489
483じゃないが。
X3010:2003の6.7.5.3の中ほど。
> 並びの中の唯一の項目がvoid型で名前の無い仮引数であるという特別な場合、関数が仮引数を持たないことを指定する。
(中略)
> 関数定義の一部である関数宣言子で識別子並びが空の場合、関数が仮引数を持たないことを指定する。
> 関数定義の一部で無い関数宣言子の識別子並びが空の場合、仮引数の個数および型の情報がないことを指定する。
でもこれって、C99なんだよね。C89とか規格書持っていないから俺は分からない。
503:デフォルトの名無しさん
08/11/20 23:39:40
>>495
オーバーロードはデフォルト引数が導入されてからずっと後にC++に取り込まれました
オーバーロードも理由の一つではありますが、そもそもはデフォルト引数です
そちらこそ知ったかはおやめ下さい
504:デフォルトの名無しさん
08/11/20 23:40:15
>>499
>そもそも間違って渡したから何だというのでしょう
間違って"渡さない"場合もあるだろ。
そしたらクラッシュするよ。
>型チェックのコストの方が高いという判断はありうることです
型チェックのコスト?
コンパイル時だからコストなんてかかんないよ
505:デフォルトの名無しさん
08/11/20 23:40:37
>>481
純粋な意味でのリンカがオブジェクトファイルを個別にチェックするのはちょっと考えられませんが。
昔の処理系では、生成したオブジェクトのほかスタートアップを陽にリンクするような方法も紹介されていました。(bccとか)
506:デフォルトの名無しさん
08/11/20 23:41:02
>>499
引数の数が間違っているとリターンがうまくいかないstdcallやpascalのことも忘れないでください。
507:デフォルトの名無しさん
08/11/20 23:42:17
>>505
なら前者を採用すればいい話だ。
508:デフォルトの名無しさん
08/11/20 23:43:10
>>504
引数をとらない関数に引数を間違って渡すとはどういう事でしょうか
意味がわかりません
引数を1個とる関数は当然に型チェックが必要ですよ
その1個の引数に間違った型でアクセスしたら大変なことになりますからね
でも引数をとらない関数は、そもそも引数自体にアクセスが出来ないのです
アクセスできない所に何が積まれようと知ったことではないのです
509:デフォルトの名無しさん
08/11/20 23:44:01
間違えました
>>504
引数をとらない関数に引数を間違って"渡さない"とはどういう事でしょうか
意味がわかりません
510:デフォルトの名無しさん
08/11/20 23:45:14
>>502
感謝です。
では、特に int main(void) という規約は必要ないことになるのですが、なぜわざわざ int main(void) という書き方を規約としたのでしょうか?
int main(void) を陽に指定する必要はないと思われるのですが。
511:デフォルトの名無しさん
08/11/20 23:45:56
>>505
int main(void)とint main(int argc, char **argv)でなくて恐縮だが、
VC++などでは、main/wmain/WinMain/wWinMainのどれが定義されているかによって、
リンクするスタートアップルーチンが変わるようになっている。
512:デフォルトの名無しさん
08/11/20 23:46:15
>>510
int main(void) と等価な書き方も許されるから
int main() も規格合致。
513:デフォルトの名無しさん
08/11/20 23:46:38
>>508
ばかだなぁ。
int hoge();
は、引数をとらないんじゃなくて、
どんな引数を渡してもいいって意味なんだよ。
わかる?
514:デフォルトの名無しさん
08/11/20 23:47:46
>>513
それも意味的には違うな。
引数に関して何も関知しないってことだな。
() は (...) とは意味が違う。
515:デフォルトの名無しさん
08/11/20 23:48:16
>>507
まあそれはそうですが、すでにその話は私のみならず他の方からも指摘されていたりするのです。>>422
516:デフォルトの名無しさん
08/11/20 23:49:33
>>515
>>422 は >>481 と同じ主張だ。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5400日前に更新/178 KB
担当:undef