4

「Matrix.h」というヘッダーで定義されたテンプレートマトリックスクラスクラスがあります。

私のプログラムでは、特定の行列が繰り返し使用されています。これらを「Matrix.h」ヘッダーファイルで次のように定義すると思いました。

const Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);

これを行うと、g++は問題の定数を再定義したと文句を言います。これは、2つの異なるソースファイルにMatrix.hが含まれているために発生します。これらのオブジェクトファイルをコンパイルすると、両方とも上記のマトリックスの定義になり、エラーメッセージが表示されます。

私の質問は、どうすればこの状況を回避できるかということです。複数のファイルにアクセスできる定数が必要ですが、どこに配置すればよいかわかりません。

4

4 に答える 4

8

あなたはそれを避ける:

  • externヘッダーで宣言します。シンボルは何度でも宣言できます。
  • 実装で一度だけ定義します。
于 2009-03-13T12:55:40.113 に答える
6

ヘッダーと実装ファイルの間で分割したくない場合は、

  1. 定数を宣言してstatic(または匿名の名前空間で宣言して)、定義を非公開にします。リンカーは文句を言いませんが、コンパイルユニット間で複数のプライベートコピーが作成されます。

    static Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
    
  2. 定数を返すインライン関数を作成します。インライン関数定義はオブジェクトファイルに「弱い」シンボルを生成するため、リンカーは重複を排除して1つを選択します。

    inline const Matrix<GLfloat>&
    GET_B_SPLINE_TO_BEZIER_MATRIX() {
        const static Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
        return B_SPLINE_TO_BEZIER_MATRIX;
    }
    
于 2009-03-13T12:56:02.767 に答える
0

このようにヘッダーファイルを書くだけです

#ifndef HEADER_FILE_NAME_H

#define HEADER_FILE_NAME_H

//ヘッダーファイルコード

#endif

これにより、複数回宣言されないようになります

于 2009-03-13T12:58:28.093 に答える
0

ヘッダーファイル(.h)をプリプロセッサの条件でラップして、コンパイラのシンボルテーブルに2回含まれないようにします。

#ifndef HEADER_NAME
#define HEADER_NAME
// code...
#endif//HEADER_NAME

HEADER_NAMEは実際には何でもかまいませんが、これは空のプリプロセッサマクロ(シンボルテーブルにも含まれる)を定義しているだけなので、衝突を防ぐためにファイルに関連するものであることを確認することをお勧めします。

于 2009-03-13T13:02:03.827 に答える