山奥に旅に出ているうちに掲示板が進んでました。
>この小細工はexternとは同一翻訳単位外のものを取り扱うものだと
>「誤解したプログラマが」書いてたもので
>言語仕様を理解していたプログラマなら書かない代物。
どうでしょうか。私が最初にコレ↓を書いた時点では、
http://kmaebashi.com/programmer/pointer.html
細かい仕様を理解していたかどうかはともかく、extern付きのとそうでないのを
同一コンパイル単位に書いてよい、ということは経験から知っていたと思いますよ
(昔のことですし、証拠を出せといわれても困りますが)。
ていうか、変数定義を入れたdefvar.cとextern宣言を入れたextern.hがあったとして、
defvar.cだけextern.hを#includeしないことは容易です。
その場合嬉しくないこととしては以下の2点があって、
(1)defvar.cとextern.hの間でコンパイラのチェックが働かなくなる。
(2)似たようなことを2箇所に書かなければならない。
774RRさんの説は、(1)を問題視したプログラマがこの小細工を使った、
というものですよね。(2)はいずれにせよ問題になるんですから。
(1)の問題は、int hoge[100];とint *hoge;みたいな問題を起こすので
確かに恐ろしいんですが、(2)の問題も存在するわけですから、
(1)の問題のため「だけ」にこの小細工が使われた、というのは無理があるように
思います。
・この小細工は、(1)の問題の解決には役に立たない(役に立つと思っている
人がいるとしたら、Cの仕様を知らないだけ)。
・(2)の問題の解決にはなるが、初期化子が書けなくなるしパーサ通らなくなる
マクロの使い方なのであまり薦められたもんではない。
ということであれば同意します。