[1033] Re:externについて
投稿者:774RR
2007/08/25 21:38:09
>かつてはexternが「同一翻訳単位外のみ」を意味していたのでしょうか?
かつてというのがどのくらい昔の話を意図してるのかわからないけど、
少なくともC89 (ISO/IEC 9899:1990) の文書には今と同じ[結合]の記述がある。
規格採択前の独自仕様の処理系については、もう知る必要も無いと思う。
俺は採択前の処理系も複数個実用してたけど、「外のみ」は無かったと追記しとく。
この小細工はexternとは同一翻訳単位外のものを取り扱うものだと
「誤解したプログラマが」書いてたもので
言語仕様を理解していたプログラマなら書かない代物。
あるいは[1022]前橋さんのコメントのように
宣言部と定義部で類似の記述を分散させるのを嫌ったプログラマが行っていたかもしれない。
----hoge.h----
extern int hoge;
----hoge.c----
#include "hoge.h"
int hoge; // これならここに初期値を書ける
--------------
hoge の記述がヘッダとソースで2回出てくるのはミスの元という人がいる
以下のように書いておけば記述が2回必要ないというわけで
----piyo.h----
#ifndef EXTERNPIYO
#define EXTERNPIYO extern
#endif
EXTERNPIYO int piyo;
----piyo.c----
#define EXTERNPIYO
#include "piyo.h" // piyo の初期値を与える手段が無い
--------------
んで [1022] に既述のごとく初期化子がうまく書けないとか問題があるんで俺はやらない。
ちなみにC++ではODRがあるので「定義にならない宣言」と「定義」は分離するのが定石。
類似の既述が2回でてくるのは仕方ない。類似は同一ではないのだから。