[1052] Re:externと「外部結合」
投稿者:774RR
2007/09/03 11:26:05
ふむー
要するに言語仕様上の extern と、英語の単語 external の不一致に違和感がある
っつーことでっか
プログラム言語のキーワードをいちいち英語とつき合わせていると違和感ありですな。
俺的に一番違和感があるのは const であります。
const ではなく readonly にしてくれると **俺的には** 解消です。
言語規格書は古い非推奨な書き方してる既存のコードが invalid にならないように
過去との互換性維持のためだけの文言・機能も含んでいるので、そーいうところは
初心者・中級者むけクラスでは一切教えない。教える必要も無い。隠しておくべし。
たとえばいまさら「関数原型宣言にならない関数宣言」など教える必要は一切無い。
「extern があると先行する宣言に従う」はまさにこの黒歴史の部分。初心者に教えるな!
# 知っておいて隠しておくのと知らないままでいるのとでは大きく違うのだがね。
extern に関して俺が後輩諸氏に説明するならばレベルに応じ
初心者向け(厳密に宣言を必ず先行させる新しいスタイルのみ教える)
・ヘッダファイル中において変数を宣言する場合には必ず extern を書くべし
→宣言とは他人/自分が [その名前] を使えるようにするものである
→他人の作った未知の関数や変数は使いたくないだろ。だから最低限素性がわからないと困るんだ
だから、ヘッダファイル中には[名前]と「紹介状」を書くべし(=これが宣言)
・他人/自分がその変数を使えるようにするために、定義を1つ .c 中に書くべし
→定義とは [その名前] の変数や関数を作って提供することである
→「紹介状」と実際の人物像が異なると困るだろ、だから紹介状を書く側には責任がある
人間の目でなくコンパイラでチェックできるよう、自作ヘッダは自作ソース中で #include しろ
そーすれば機械が不一致を検出してくれる
→紹介状は複数人で回覧することができる (宣言は複数回あっていい) が、
実際の人物は1人しかいないわけだから定義は1つ。
宣言と定義の簡易解説は必要。詳細解説までは不要。
結合や記憶域期間や可視性、等の詳細については説明不要 (消化不良になるだけ)
中級者向け(旧式の非推奨な書き方してるソースコードには触らせない)
・宣言と定義の詳細解説
・内部結合と外部結合と無結合の違い
→「原則として」と前置きして extern は外部結合・定義にならない宣言となると解説
(変数宣言に extern があっても定義になりうると話しても混乱を招くだけなので説明しない)
→「原則以外は?」と問われたら上級者向け解説を実施
関数の場合の話を問われたら
・関数宣言と関数定義はソースコード上の記述形式が明確に異なるので区別できるから
extern/static は結合の決定にのみ使われるとフォローし
・static が明記されていない場合は extern が省略されていると解説 (X3010:1993 に準拠)
・これは変数の場合と挙動が異なるぞ、ともフォロー
上級者向け(既存のソースコードのダークサイドまで全部面倒見る人向け)
・言語規格書の章番号+解説
・相手に興味がありそうで時間もあれば既に書いた俺妄想による Rationale をフォロー