質問: 自分なりにstaticとinlineの意味をまとめたのですが意味が正しいのかわからないので正しい意味を教えていただきたいです。 * ヘッダーでinlineを付けた関数は使われる場所に刷り込まれる * ヘッダーでstaticを付けた関数は内部結合 * ヘッダーでstaticを付けたら内部結合??? * クラスでstaticを付けた変数は静的記憶域期間 * ヘッダーでstaticもinlineも付けずに変数や関数を宣言してはいけない。 * 関数の中でstaticを付けた変数は静的記憶域期間 * ソースファイルとヘッダーでstaticを付けた変数は内部結合 * ソースファイルの一番外でstaticを付けなかった変数は外部結合で同じ名前は使えないが関数は宣言をすると別のソースファイルでも使える。???
回答: 言語規格でどう言っているかは別にして、`static` には3種類あると思ってください。 `inline`はまた別の話なので、回答しません。 トップレベルの変数・関数に対する `static` 変数または関数を内部結合にします。関数の場合、`static`は**宣言**に付ければよく、宣言とは別に**定義**がある場合、定義の方には付けても付けなくてもよいです。変数の場合は`static`を付けると宣言と定義が分離できません。 内部結合にするという役割のため、**ヘッダ内でこの`static`を使うことはありません**。ヘッダファイルは他のソースファイルと共有するために作るので、内部結合のものがヘッダにあっても混乱するだけです。 関数内のローカル変数に対する `static` 変数を静的記憶域期間にします。 クラスメンバーに対する `static` 変数を静的記憶域期間にします。つまり、そのクラスのインスタンスの生存期間とは関係のない変数となります。内部結合は関係ありません。 関数の場合は、そのクラスのインスタンスを必要としないがクラスには属する関数となります。内部結合は関係ありません。 > > //ヘッダーでstaticを付けた関数は内部結合 > > //ヘッダーでstaticを付けたら内部結合??? > > > そうですが、ヘッダで関数や変数にstaticを付けないでください。そういうものはヘッダから削除して、実装ファイル(*.c, *.cc など)内だけで使います。 > > //クラスでstaticを付けた変数は静的記憶域期間 > > > はい。 > > //ヘッダーでstaticもinlineも付けずに変数や関数を宣言してはいけない。 > > > 変数に関しては、そうです。ヘッダ内では`extern`を付けるはずです。何も付けないと、同じ名前の変数が増殖します。 関数では問題ありません。何も書かないと`extern`扱いになります。 > > //関数の中でstaticを付けた変数は静的記憶域期間 > > > はい。 > > //ソースファイルとヘッダーでstaticを付けた変数は内部結合 > > > はい。しかし、ヘッダで`static`変数を宣言しないでください。 > > //ソースファイルの一番外でstaticを付けななかった変数は外部結合で同じ名前は使えないが > > 関数は宣言をすると別にソースファイルでも使える。??? > > > 外部結合な変数関数は、どこかでで宣言すれば使えるようになります。宣言はヘッダに書いておくのが普通です。