- 1 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 12:11:46.61 ID:xxeaCAplM.net]
- !extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C99 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ ※前スレ C言語なら俺に聞け 157 https://mevius.5ch.net/test/read.cgi/tech/1624846971/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 684 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 12:13:41.38 ID:Bgq8kBxf0.net]
- >>669 関数定義とその呼び出しを比較するって書かれてるのに、きみが無視するから噛み合わないんだよ。
- 685 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 12:16:16.46 ID:BOW2YZM80.net]
- >>674
void func() { } /* 定義 */ int main() { func(); /* 呼び出し */ } どこが矛盾なんだ? # 迂闊な答えをすると罠があるから気をつけな
- 686 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 12:18:15.22 ID:BOW2YZM80.net]
- >>670
その時点ではアバウトな言葉遣いが容認される流れだったが 厳密さを求める流れにあんたが変えたんだよ
- 687 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 12:27:06.91 ID:Bgq8kBxf0.net]
- >>675 その例だけなら矛盾しないね。でも引数渡せないから>645のやりたかったことはできないよね。
- 688 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 15:54:04.85 ID:BOW2YZM80.net]
- >>677
引数が空のときにに意味を持たせるんだったな void func() { puts("no arguments are given"); } int main() { func(); } # さっき言った「罠」がまだここにある
- 689 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 16:19:19.10 ID:Bgq8kBxf0.net]
- まともに話す気なさそうだし、もういいや。
C言語では>>645に書かれてるようなことはできなくて、 >>654の「第一引数は不定」はどうせ未定義動作の間違い、 という点に異論が無ければ、これ以上語ることもない。
- 690 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 16:34:27.02 ID:cwJzo4Jp0.net]
- nantoka()と呼び出した場合、
呼び出された関数は、 nanntoka(char adress)として スタック上からadressを取り出そうとするが ここにある値はNULLではなく、不定値(所謂ゴミ) NULL判定で回避はできない
- 691 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 16:37:54.51 ID:ir4nxYTVd.net]
- >>678
Once again, once again, you're on your own Who's to blame? who's to blame? it's such a shame No-one ever hears your name, or plays your game
- 692 名前:デフォルトの名無しさん [2022/06/13(月) 18:45:35.75 ID:+5MOS3Faa.net]
- >>680
> スタック上からadressを取り出そうとするが だからそれを実行するかどうかもわからんって話 未定義動作ってそういうもんだ
- 693 名前:デフォルトの名無しさん [2022/06/13(月) 18:53:43.72 ID:HsopZ7m+d.net]
- グローバル変数 int exists_adress; を介してやれば引数あり/なし のモードを未定義動作を回避しつつ設定できそう
実用性など皆無だが
- 694 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 19:17:35.58 ID:ir4nxYTVd.net]
- >>682
読み出すまではできるだろ 戻りアドレスか関係ないレジスタの退避値が入っている 問題はここではエラーにならず次にこの値で何かしようとしたらクラッシュする可能性が高い これは単にコンパイラを騙して原因がわかりにくいエラーを出す方法なだけ 全くなんの意味もない
- 695 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 19:21:03.88 ID:cwJzo4Jp0.net]
- 分からないなら、試して見れば良いのに
- 696 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 19:40:41.59 ID:+5MOS3Faa.net]
- >>684
だからコンパイラは読み出すコードを吐く義務はない 未定義動作とわかった時点で呼び出しすらしないコードを吐く可能性もある 未定義動作ってそういうもんだ
- 697 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 19:46:28.66 ID:cwJzo4Jp0.net]
- 読み出さなければ、実行時エラーにならないだろう
なんで、なるの?
- 698 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 19:48:48.04 ID:cwJzo4Jp0.net]
- 呼ばれた側の関数は、adressに入っている(はずの)値を使うんだぜ
コード吐かなければ、それこそコンパイラのバグになるぞ
- 699 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 19:52:23.50 ID:cwJzo4Jp0.net]
- 実際に呼び出すコードは、呼ばれた側の関数に実装されるが、
呼び出し側の引数セットありと、引数セット無しで、 違うコードが実行されたりするのか?
- 700 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 20:03:29.40 ID:Q7R38T3J0.net]
- 何が起こっても不思議ではない未定義派と、コンパイラ実装は実質こうなってる派で話が噛み合うはずがないと思うの。
- 701 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 20:05:01.34 ID:cwJzo4Jp0.net]
- 信仰と言うより、勘違いだろう
恥ずかしくて後に引けなくなった感じ
- 702 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 20:09:56.04 ID:cwJzo4Jp0.net]
- 引数セットするのは、呼び出し側
コンパイラが呼び出し側で引数がないと判定した結果、 気を利かせて呼び出さないコードを吐くって一体どういうことだろう 呼ばれた側は機械的にあるはずの引数にアクセスする 呼ばれる側はセットしてないなんて分からないからアクセスしてしまうぞ
- 703 名前:デフォルトの名無しさん [2022/06/13(月) 20:10:29.53 ID:8KDu5nutr.net]
- >「罠」がある(キリッ
とかお寒いこと書いちゃうくらいだしよほど視野が狭くなってたんだろうなぁ
- 704 名前:デフォルトの名無しさん [2022/06/13(月) 20:15:33.10 ID:iGSNe98na.net]
- stdcall と cdecl の話か?
どっちにしても引数省略されたのかされてないのか呼ばれた方では判らん C++なら省略の代わりにデフォルト引数入れたりマングリングしたり出来るが Cではどうしようもない
- 705 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 20:17:50.97 ID:6K7aQgyCM.net]
- >>693
コピペで使えそうだなw
- 706 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 21:42:41.32 ID:PLcvpN2h0.net]
- >>688-689,691-692
コンパイルエラーとして全くコードを吐かないという事すら可能なのに何を言ってるんだよ... 今時未定義動作すら考慮して最適化したりしてる時代なんだぞw https://qiita.com/kaityo256/items/d2677e178be0180482e8
- 707 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 21:44:17.84 ID:ir4nxYTVd.net]
- >>686
何か勘違いしてないか コンパイラが未定義動作とわかったらエラーか最低でもワーニングを出す コンパイラにはわからないからバグになるんだよ
- 708 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 22:00:44.23 ID:cwJzo4Jp0.net]
- ワーニング笑
- 709 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 22:05:19.85 ID:cwJzo4Jp0.net]
- 一体どこのコンパイラがコード吐かずに停止するんだよ
- 710 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 22:14:04.47 ID:PLcvpN2h0.net]
- >>697
> コンパイラが未定義動作とわかったらエラーか最低でもワーニングを出す そんな義務はない > コンパイラにはわからないからバグになるんだよ 同一翻訳単位ならわかるだろ 勘違いしてるのは君、と言うか君の知識が浅すぎるだけ >>699 存在するかどうかは関係なく規格上はそう言う処理系でも規格準拠という話
- 711 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 22:42:16.41 ID:cwJzo4Jp0.net]
- つまり実在しないコンパイラってことだな
- 712 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 22:44:07.87 ID:cwJzo4Jp0.net]
- オレ以外、全員狂ってるって言ってるのと同じ
- 713 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 22:44:55.56 ID:cwJzo4Jp0.net]
- こいつと同じ職場でなくて良かった
- 714 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 23:54:32.34 ID:uF/nHRZy0.net]
- 法解釈論「人殺しは違法であり罰される」
実運用論「証拠を完璧に隠滅できれば罰されない」 意固地になっちゃってるから何言っても無駄
- 715 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 03:02:34.64 ID:bOBoFDUrM.net]
- 意固地になるとアスペチックになるのか
アスペチックだから意固地になりやすいのか
- 716 名前:デフォルトの名無しさん (ワッチョイ ff01-MmlY) mailto:sage [2022/06/14(火) 06:01:33 ID:WigeF4Tr0.net]
- 意固地もなにも未定義動作なんて規格の話なんだから実運用論とか言われてもねw
- 717 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 06:16:24.48 ID:XpDhKBGs0.net]
- >>679
第一引数が不定とは、第一引数を何らかの方法で取り出した場合の話だが おまえさん、その方法はどんな方法を想定しているんだ?
- 718 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 07:36:21.84 ID:/Eif446V0.net]
- 自分で言った言葉に?みつく芸なんだろうか
- 719 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 10:22:14.90 ID:2fucKJss0.net]
- >>707
>654が言ってるのはどうせこんなのだろうと思ってた。 https://wandbox.org/permlink/aiZH8Ytc91RyQ7HL #include <stdio.h> void func(); int main() { func(); } void func(int x) { printf("%d\n", x); }
- 720 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 10:32:47.66 ID:rBU/2bdp0.net]
- 実体記述時と、宣言&呼び出し時とで、引数の型や個数の不一致
コンパイルが通るかもしれんけど、どう動くかわからないし 俺の環境ではこう動くからと、それを信じて採用するには怖すぎる
- 721 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 10:33:48.55 ID:XpDhKBGs0.net]
- >>709
654は俺でまあそんなとこだが 俺は今679に聞いている おそらく「654と同じ」とかなんとか言って 自分の手の内は隠したまま人の批判をするんだろうけどな
- 722 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 10:44:32.74 ID:2fucKJss0.net]
- >>711 え? 679 (ワッチョイ 835f-GGE9) だから答えたのに何でよくわからんイチャモンつけられてんの?
いやまぁ、予想通りで結論に異論無いならいいんだけどさ。
- 723 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 10:50:39.67 ID:rBU/2bdp0.net]
- 省略時のデフォルト引数と(マングリング等による)別実装
C以前の言語でもありそうだし前者は検討してそうなもんだけど見送ったなりの理由があるんだろうか
- 724 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 10:52:59.20 ID:2fucKJss0.net]
- 想定が合ってたということで改めて結論も明記しとくと、
>709 のプログラムが未定義動作を起こすのは不定な x の値を使用するからではなく、 func(int x) に対して引数の数が不正な関数呼び出し func() を行うからであって、 x の値を使用しない場合(例えば関数内を空にした場合など)ても未定義動作になる、という話ね。
- 725 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 10:53:17.30 ID:XpDhKBGs0.net]
- >>712
ほらな、やっぱり自分の手の内は晒さない
- 726 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 11:13:15.99 ID:rBU/2bdp0.net]
- 661の立場だと
void func(int x) { } ・・・・・ func(); は、記述のほうで x をリファレンスしてないからセーフで未定義には該当しないと読めるが そいう主張なのかな
- 727 名前:デフォルトの名無しさん [2022/06/14(火) 11:51:03.61 ID:2oEiwFQbr.net]
- 引っ込みつかなくなると大変だね
- 728 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 12:19:58.97 ID:zr4Ezotf0.net]
- 単に使われない変数があるってだけだと思うが
- 729 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 12:58:48.08 ID:WigeF4Tr0.net]
- >>718
>>717ww
- 730 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 13:36:14.16 ID:rBU/2bdp0.net]
- 実装の話
関数側でスタックに詰まれた引数をクリーンアップする呼び出し規約(pascalcall や stdcall) だと 明後日に飛んでいくのか
- 731 名前:デフォルトの名無しさん [2022/06/14(火) 19:11:20.40 ID:DieH08Hx0.net]
- 引き数の値で関数内の処理を分けるか普通に関数分ければいいやん
- 732 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 21:11:51.49 ID:VPcVb+UNM.net]
- 普通の人ならそうするが、
普通で無い方法が無いかを いろいろ議論している 暇つぶしとも言う
- 733 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 21:17:41.30 ID:XpDhKBGs0.net]
- 特定されない限りあらゆるケースを想定するからな
- 734 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 23:50:32.80 ID:dnqAP5Hg0.net]
- >>718
DLLの呼び出しみたいに呼び出し先の実装をコンパイラが知らない場合 例えば引数をスタックに積む呼び出し規約だと ↓正常な動作 1)戻り先のアドレスをスタックに積む 2)引数をスタックに積む 3)DLL側のコード実行時にpopしてスタックから引数ゲット 4)いろいろ処理してpopして戻り先アドレスをゲットしてりたーん これが↓異常な動作 1)戻り先のアドレスをスタックに積む 2)なんもない 3)DLL側のコード実行時にpopしてスタックから引数ゲット 4)いろいろ処理してpopして戻り先アドレスをゲットしてりたーん 5)わし、迷子 ってなるんちゃうん? 引数がレジスタ渡しなら、ただ変な数値受け取るだけで済むけど、今ここでの話じゃ限定してないようだし
- 735 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 00:28:34.16 ID:kIvvyTdz0.net]
- 呼び出しって引数をスタックに積んでから、呼び出すんじゃなかったかな
- 736 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 00:38:49.11 ID:3+VQJWvy0.net]
- >>725
そうだよ だから func(int);な関数をfunc(void); で呼び出したらスタックにずれが生じる可能性がある
- 737 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 00:43:20.78 ID:kIvvyTdz0.net]
- 引数をスタックに積んでから、戻りアドレスを積んでCallするなら、
func関数はスタック先頭位置にあるアドレスに戻るだけではないかな 積まれている引数はその下だからズレないと思う
- 738 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 00:57:26.32 ID:3+VQJWvy0.net]
- >>727
>引数をスタックに積んでから、戻りアドレスを積んでCallするなら、 逆だぞ 戻りアドレスをスタックに積んでから引数をスタックに積む、その状態でfuncをコールする そうしないと、次のpopでは戻りアドレスを受け取ることになり、引数を受け取れない コールされ
- 739 名前:たfuncはpopし引数を受け取って処理(この間にスタックへのpush/popがあったりして)、最後にpopして戻りアドレスを受け取って呼び出し元に帰る []
- [ここ壊れてます]
- 740 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 01:08:25.20 ID:kIvvyTdz0.net]
- 戻りアドレスをスタックに積むのは、機械語のCALL命令が行うんでしょう?
- 741 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 01:16:07.05 ID:kIvvyTdz0.net]
- VCでアセンブラソース出力させてみました
int main() { call(1); call(); return 0; } int call() { return 0; }
- 742 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 01:17:50.09 ID:kIvvyTdz0.net]
- _main PROC
; Line 2 push ebp mov ebp, esp ; Line 3 push 1 call _call add esp, 4 ; Line 4 call _call ; Line 5 xor eax, eax ; Line 6 pop ebp ret 0 _main ENDP
- 743 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 01:18:18.33 ID:kIvvyTdz0.net]
- _call PROC
; Line 8 push ebp mov ebp, esp ; Line 9 xor eax, eax ; Line 10 pop ebp ret 0 _call ENDP
- 744 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 01:22:13.35 ID:3+VQJWvy0.net]
- そうでした
うんこは消えます
- 745 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 05:01:22.73 ID:oeHjaPLHa.net]
- フレームポインタってのもあって
まあなんでもいいんです
- 746 名前:デフォルトの名無しさん [2022/06/15(水) 15:38:51.27 ID:IEWflW3Ga.net]
- >>728
馬鹿発見
- 747 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 18:22:38.94 ID:mSaBC5As0.net]
- >729
全てのCPUにCALL相当の命令があるとは限らないってことを頭の片隅に。
- 748 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 19:14:29.02 ID:kIvvyTdz0.net]
- CALL命令のないCPUにCってどういう風に実装するのかな
キッと神様のような人だろうと思う
- 749 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 19:34:49.70 ID:vqdnmmaIa.net]
- 最近call見ないよね
命令はあるけど
- 750 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 19:53:29.20 ID:XKwaNEU7
]
- [ここ壊れてます]
- 751 名前:0.net mailto: >>736
C言語で書いたコードが実行できるようなCPUでCALL相当の命令がない奴なんてあるのか? まさかと思うけどBSR(Branch SubRoutin)とかBAS(Branch and Save)はCALLと綴りが違うんだーっていう主張じゃないよね [] - [ここ壊れてます]
- 752 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 19:55:51.69 ID:XKwaNEU70.net]
- >>737
汎用機みたいにスタックが無いマシンだとソフトでスタック作るとかする
- 753 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 20:05:59.02 ID:kIvvyTdz0.net]
- 呼出も戻りも、ジャンプ命令で実装するんかい?
「食らえ、GOTO攻撃!」
- 754 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 20:06:30.10 ID:gppE9X5h0.net]
- >>737
厳密じゃないけど、 push pc jmp xxxx : pop pc みたいな。push pcする時にjmpのアドレスの次を
- 755 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 20:07:41.69 ID:gppE9X5h0.net]
- 途中で書き込んてしまった。
>>737 厳密じゃないけど、 push pc jmp xxxx : pop pc みたいな。push pcする時にjmpの次のアドレスをpushする必要があるけど。
- 756 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 20:29:16.05 ID:mSaBC5As0.net]
- >739
2000年あたりのスパコンのデバッグやってたけどスタックポインタ自体無かったよ。 汎用レジスタの一つをスタックポインタの様に使ってた。 スパコンのPEはCPUじゃ無いっていうならそれまでだけど。 OSがCで書かれてたよ。
- 757 名前:はちみつ餃子 mailto:sage [2022/06/15(水) 20:38:36.75 ID:VY0KZJ3n0.net]
- 専用のレジスタを用意するかわりにアドレシングモードを充実させてるタイプの CPU もあるとは聞いたことは有る。
複数のスタックを用途別に使ったりする運用も出来るので便利っぽいよ。
- 758 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 20:42:40.26 ID:Z7kfo4VR0.net]
- リンクレジスタを使うアーキテクチャは
呼び出しも戻りもジャンブだよ
- 759 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 21:27:21.82 ID:XKwaNEU70.net]
- >>744
だから>>740に書いたように汎用機みたいにハードウェアスタックが無いプロセッサーは普通にあるよ でもBASみたいにサブルーチンを呼び出す命令はある(戻りアドレスをレジスタに格納してジャンプする) スパコンの命令セットは見たことないけど似たような命令はあると思う
- 760 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 21:32:09.09 ID:mSaBC5As0.net]
- JMPで呼び出した関数に飛んで、
JMPで呼び出し元に戻って行ってたよ。 RET、それ相当の命令が無かった(使われてなかった?)。
- 761 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 21:47:48.01 ID:vqdnmmaIa.net]
- ぴゅう太のCPUとか全然レジスタなかった
- 762 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 21:51:15.67 ID:XKwaNEU70.net]
- >>748
どこのスパコン?
- 763 名前:デフォルトの名無しさん [2022/06/15(水) 21:56:54.74 ID:Ltc382Vw0.net]
- Z8スーパーコンピュータ
- 764 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 21:58:58.10 ID:XKwaNEU70.net]
- >>749
あれはレジスタはメモリー上に置くって言う設計思想だから
- 765 名前:デフォルトの名無しさん (ワッチョイ 7f36-GGE9) mailto:sage [2022/06/15(水) 22:55:33 ID:mSaBC5As0.net]
- >750
富士通。 実機は見たこと無い。 なんかアメリカに設置されてて、日本の端末(FMVにFreeBSDかなんか入れてた)からtelnetで入って作業してた。 入社1年目だったんでテスト作業員+フリーズした場所の特定と原因予想してた。
- 766 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 07:08:44.59 ID:ilsRfae90.net]
- STM 14,12,12(13)
LR 12,15 GETMAIN RU,LV=72 ST 13,4(,1) ST 1,8(,13) LR 13,1
- 767 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 07:48:03.24 ID:acnLqVz40.net]
- >>753
2000年辺りならベクトルタイプのVPP シリーズの方かな スカラパラレルはUltraSPARCだし
- 768 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 14:04:28.10 ID:6d6damS40.net]
- ① struct _Hoge;
② typedef struct _Hoge Hoge; ③ struct _Hoge { int a; }; ④ typedef struct _Hoge { int a; } Hoge; ↑の①~④はどれが「定義」でどれが「宣言」かよくわからんです typedef の def は define(定義)の def ですが 変数作って値を定義していないので全部宣言ですかね?
- 769 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 14:15:11.58 ID:ilsRfae90.net]
- 原則、重複が許されるのが宣言、許されないのが定義
ただし仮定義のような例外も一部ある
- 770 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 14:18:30.74 ID:6d6damS40.net]
- そうすると①は宣言ですね
- 771 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 14:37:35.99 ID:ilsRfae90.net]
- うむ
- 772 名前:デフォルトの名無しさん (アウアウウー Sa67-iSSN) [2022/06/16(木) 19:53:21 ID:hEUIHdUOa.net]
- コンパイラが単語を覚えるのが宣言
メモリに実態が産まれるのが定義
- 773 名前:デフォルトの名無しさん (ブーイモ MM7f-a+sK) mailto:sage [2022/06/16(木) 20:19:36 ID:2MvWGhryM.net]
- ③書いたところでメモリに実体生まれんだろ
- 774 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 22:26:58.67 ID:6d6damS40.net]
- ③を2回書くとエラーになりますね
この辺は沼でしょうか? 厳密に分けても何かに役立つというものでもないし・・・
- 775 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 23:14:06.95 ID:y5qePP6X0.net]
- そういう風に決めたなら仕方がないが
意味的には、定義と宣言って逆な印象を受けます 数学でいうと、 点や直線の定義では実際の描画はまだですが 点や直線の宣言っていうと、その場に描画すると言うイメージ
- 776 名前:はちみつ餃子 mailto:sage [2022/06/16(木) 23:16:16.53 ID:yR1zGyRS0.net]
- 宣言と定義の意味については C99 だと 6.7 に記述がある
> 宣言は、幾つかの識別子の解釈及び属性を指定する。 > 識別子の定義 (definition) とは、宣言のうち次のものをいう。 > ・ オブジェクトに対しては、そのオブジェクトの記憶域を確保する宣言 > ・ 関数に対しては、関数本体を含む宣言 > ・ 列挙定数又は型定義名に対しては、その識別子の (唯一の) 宣言 逆に言えば定義は常に宣言でもある。
- 777 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 05:27:18.60 ID:zopwF6/i0.net]
- 実体が作られるといっても
プログラムイメージにスペースが確保されるとは限らない 静的記憶域期間を持つものはプログラムイメージに作られるが 自動記憶域期間を持つものは実行中に割付と解放が行われるし 構造体のメンバ宣言並びはコンパイラのメモリに作られる これらのいずれも「定義」となる
- 778 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 07:51:59.32 ID:bL392TY50.net]
- >>765
> 構造体のメンバ宣言並びはコンパイラのメモリに作られる それは > コンパイラが単語を覚えるのが宣言 の方じゃね?
- 779 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 08:44:28.03 ID:rAke7YJm0.net]
- なんとなくのイメージ
・宣言 「xxxxって名前の変数(関数)がどっかにあるらしいよ。詳しいことは知らん。」 ・定義 「xxxxの詳細はココに書かれたxxxxxである!これは決定事項である!!」
- 780 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 13:54:11.29 ID:zopwF6/i0.net]
- >>766
struct _Hoge; struct _Hoge; // OK これは _Hoge という識別子がタグ名という定型データとして作られ、 その後、定型データの中の属性フラグが検査されて一致が確認される struct _Hoge; union _Hoge; // NG これは定型データの中の属性フラグが検査され不一致が検出される struct _Hoge; struct _Hoge { int a; }; // OK これは定型データの中のポインタがまずNULLで作られ、 次に、そのポインタでメンバ宣言列という不定型データを指す struct _Hoge { int a; }; struct _Hoge { int a; }; // NG これは既にNULLでなくなったポインタの貼りかえで拒否される 宣言の重複は矛盾の検出のみを行い 定義の重複は不定型データの再作成で拒否される { } は無結合
- 781 名前:デフォルトの名無しさん [2022/06/17(金) 16:09:04.52 ID:G79h5Zera.net]
- >>763
誤訳
- 782 名前:デフォルトの名無しさん [2022/06/17(金) 16:13:44.68 ID:G79h5Zera.net]
- struct _Hoge { int a; };
struct _Hoge { int a; }; // NG この場合でもコンパイル単位が別ファイルだと(ほぼ)問題無い訳で 一致していなければ一致していないなりの結果が産まれる
- 783 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 16:33:58.20 ID:zopwF6/i0.net]
- >>770
(ほぼ)は不要 問題ないというか完全に同じ内容になっていない場合は未定義の動作
- 784 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 19:28:59.11 ID:bL392TY50.net]
- >>768
なにを言いたいのかさっぱりわからんw
|

|