1

センサーを静的として宣言すると、リンカーはatexit への未定義の参照について不平を言います。

センサーを非静的として宣言すると、そうではありません-なぜですか?

//C++ クラスの静的関数

AP_Compass_Backend *AP_Compass_HMC5843::detect(Compass &compass)
{

    static AP_Compass_HMC5843 sensor(compass);
    bool result = sensor.init();

    if (result == false) {
        return NULL;
    }
    return &sensor;
}
4

2 に答える 2

2

どうやらそのプラットフォームでは、ローカルの静的期間オブジェクトの破棄は、atexit呼び出しを登録することによって行われます。

mainすべてのデストラクタを適切な順序で呼び出すだけで、終了時に明示的に破棄できるため、グローバルの破棄には何も必要ありません。

ただし、 localstaticの場合、(関数が入力されていない場合) オブジェクトが構築されていない可能性があるため、動的に破棄を登録する方法が必要です。関数レベルの静的オブジェクトは、最初にスコープに入ったときに構築されることを思い出してください (スコープに入った場合のみ)...これは C++ の保証です。

動的デストラクタ チェーンを手動で実装することもできますが (たとえば、リンクされたリストを維持するなど)、依存することatexitも実行可能なオプションのようです。

于 2015-12-03T18:48:08.943 に答える
1

センサーを静的として宣言すると、リンカーは atexit への未定義の参照について不平を言います。

プラットフォームのコンパイラはatexit、静的オブジェクトの破棄に関数を使用しているようです。通常atexit、アプリケーションの終了後に何らかのコードを実行したい場合にプログラマーが使用します。

センサーを非静的として宣言すると、そうではありません-なぜですか?

デストラクタを呼び出す必要がある静的グローバル オブジェクトがないためです。

静的オブジェクトの破棄が許可されていない場合、プラットフォームの制限を考慮していないライブラリ/コードを使用する可能性があります。それは、シナリオが不可能なためです。atexit以下のように空の関数を追加することをお勧めします。

int atexit(void (*func)()) {
    return 0;
}
于 2015-12-03T19:19:30.193 に答える