1

多くの機能を持つ C++ のプロジェクトに取り組んでいます。私はそれらをメインプログラムに書きたくないので、関数ごとに個別の .cpp ファイルを書きたいと思っています。これらの関数のほとんどはいくつかの配列に作用するため、これらの配列をグローバルにしたいと考えています。そこで、globals.cpp という別の .cpp ファイルですべての配列を宣言し、extern という接頭辞が付いた globals.h ファイルに配置しました。いつものように関数とメインプログラムを書きましたが、コンパイルすると

ここに私が持っているものがあります:

//globals.cpp

#include <iostream>
#include <blitz/blitz.h>
#include <blitz/array.h>
#include "prototype.h"
#include "globals.h"

BZ_USING_NAMESPACE(blitz)

Array<double,2> A(5,5);

私が持っているglobals.hファイルで

#ifndef GLOBALS_H
#define GLOBALS_H
extern Array<double,2> A(5,5);
#endif

次に、関数add.cppがあります。たとえば、

#include <iostream>
#include <blitz/blitz.h>
#include <blitz/array.h>
#include "prototype.h"
#include "globals.h"

BZ_USING_NAMESPACE(blitz)

void add.cpp(){
   for(int i=0;i<5;i++){
      A(i,i)=i*i;
   }
}

私は明らかにそれをprototype.hファイルに含めます

#ifndef GLOBALS_H
#define GLOBALS_H
void add();
#endif

最後に、メイン プログラム mainprog.c があります。

#include <iostream>
#include <blitz/blitz.h>
#include <blitz/array.h>
#include "prototype.h"
#include "globals.h"

BZ_USING_NAMESPACE(blitz)
int main(){
   add();
   cout<<A<<endl;
   return 0;
}

ただし、コンパイルすると、「globals.h:6:8: error: 'Array' does not name a type」というエラーが表示されます

次に、エラー A が宣言されていないことを示す add.cpp 関数のエラー。

ブリッツ配列をグローバルとして宣言するにはどうすればよいですか? ありがとうございます`

4

1 に答える 1

1

問題は、namespace() をインポートするマクロBZ_USING_NAMESPACEが globals.h のインクルードの下にあることです。したがって、globals.h で参照しようとしている Array クラスは、実際にはその時点で blitz::Array か何かです。

簡単な修正として、A の宣言のすぐ上にある globals.h の BZ_USING_NAMESPACE を使用するだけです。

ヘッダー ファイルに必要なすべてをそのヘッダー ファイルに含めることを常に忘れないでください。

#ifndef GLOBALS_H
#define GLOBALS_H

#include <blitz/blitz.h> //No idea if the Array class needs this header.
#include <blitz/array.h>
BZ_USING_NAMESPACE(blitz)

extern Array<double,2> A(5,5);
#endif
于 2012-05-19T15:45:41.670 に答える