[1050] Re:externと「外部結合」
投稿者:774RR
2007/09/02 08:31:11
>最初期のCではexternはあってもなくても同じだったらしい
「最初期」をどのくらいまで遡るか次第、だけど
俺妄想だと Kerningham/Ritchie が作った直後のCには、たぶん
extern はまったく無かったのだろうと思う。
なおかつリンカーが bss combine を勝手に行ってしまう都合上
ODR は実装したくても実装するすべが無かった。
----aaa.c----
static int i1; // internal linkage, definition
int i2; // external linkage, definition
----bbb.c----
static int i1; // internal linkage, definition, another instance of aaa.c!i1
double i2; // external linkage, definition, different decl of aaa.c!i2
----bss in a.out---
aaa.c!i1;
bbb.c!i1;
common!i2; // combined together, uses maximum size
bss combine 機能が無いリンカーをもつ処理系に移植する際に困ったので
後付で extern を追加したが、そのときにはすでに extern を持たないCで書かれた
ソースコードがたくさんあったので、互換性を維持するには?と考えた結果が今の仕様
あと初期化子の有無で挙動が異なるのも、リンカーの都合
(非0の)初期化子がある=bss に置けない=bss combine が効かない
って、これも妄想
歴史家なら、黒歴史を追及するのもまあお仕事ですし、実際面白そうだけど
1ユーザとしては今ある仕様を理解するほうが建設的かなーって思うのであった