2

Car というクラスを定義するがありCar.h、 my を実装する Car.cpp の実装があるとします。class Carたとえば、 my Car.cppcan be :

struct Helper { ... };
Helper helpers[] = { /* init code */  };
Car::Car() {}
char *Car::GetName() { .....}

ヘルパー配列の寿命は? 言う必要がありますstatic Helper helpers[];か?私がいくつかの悪い習慣を行っている場合は、お知らせください。

4

2 に答える 2

3

グローバル/名前空間スコープで宣言/定義された変数には、コードが終了するまで完全な寿命があります。

Helper helpers[];内でのみアクセスできるようにする場合は、次のCar.cppように宣言する必要がありstaticます。それ以外の場合は、グローバルにします。言い換えると、

Helper helpers[];        // accessible everywhere if `extern`ed to the file
static Helper helpers[];  // accessible only in `Car.cpp`

編集:@andrewdskiが下のコメントで提案したように。このファイル内で使用しているため、変数helpers[]として作成する必要があります。外には見えないstaticのに。HelperC++ では、2 つのまったく異なるユニットに同じ名前のグローバル変数がある場合、コンパイラはそれらを同じメモリ位置に参照することで、黙って混乱を引き起こします。

于 2011-07-15T03:11:22.317 に答える
2

ファイル スコープで定義されたオブジェクトは、Static Storage Durationオブジェクトと呼ばれます。

ほとんどの場合、それらは main() に入る前に作成され、main() が終了した後に破棄されると考えることができます (例外もありますが、私はそれについて心配しません)。

  • 静的ストレージ期間変数の破棄の順序は、作成の逆順です。

  • 同じコンパイル単位 (ファイル) 内での作成順序は、それらが宣言されている順序です。

    • Static Storage Duration注:異なるコンパイル単位でのオブジェクトの作成順序について保証はありません。
于 2011-07-15T03:28:08.410 に答える