若手社員のKDさんが、外部から入手したプログラムのソースを整理する仕事をしていた。整理の方向性としては、「グローバル変数とスタティック変数(Cで言うところの)をクラス化する」。クラス化すると言ってもCなので使うのはstructなのだが。
作業途中で解決できない問題が出たという話。「struct宣言どおしの関係がうまくいかなくてコンパイルエラーが出る」だという。
なので、以下のコードを提示した。
struct ABC; ←※
struct XYZ
{
// struct ABC abc; ← これはNG
// 実体を入れようとするとまだABCの全容が
// コンパイラにとってわからないのでエラー
struct ABC *abcptr; // ポインタはOK
};
struct ABC
{
struct XYZ xyz; // ここは実体OK。
};
KDさん曰く、このコードを参考にしたら、問題が解決し仕事が進んだとのこと。めでたし。
この構造?の呼び名が、前方参照、前方宣言、後方参照・・・だったか、わからなくなっていた。
この記事を書くにあたり、ネットで調べてみると上記※印のところを「不完全宣言」いう表現もあるようだ。この言い方もちょっと物騒でビックリな感じもするが、前だか後ろだかというような相対的な表現よりいいかな。