2012-05-19 43 views
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); 

在全局變量。 .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:錯誤:'Array'沒有指定類型

然後在add.cpp函數中聲明錯誤A沒有聲明。

如何將突擊陣列聲明爲全局? 謝謝 `

回答

1

問題是,您的宏導入命名空間(BZ_USING_NAMESPACE)低於您的包括globals.h。因此你想要在globals.h中引用的Array類實際上就是blitz :: Array或者某個東西。

對於一個簡單的修復,只需使用BZ_USING_NAMESPACE在globals.h您的權利聲明之上爲A.

永遠記得包括一切在頭文件頭文件的需求。

#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 
+0

我所做的更改globals.h文件如你所說,並在主程序和附加功能把BZ_USING_NAMESPACE宏觀上面的#include「globals.h」。但現在我得到以下錯誤(寫在下一個評論) – lovespeed

+0

在mainprog.cpp包含的文件中:7:0: globals.h:8:25:warning:'A'初始化並聲明爲'extern' 在文件包含在add.cpp中:5:0: globals.h:8:25:warning:'A'初始化並聲明爲'extern' 從globals.cpp包含的文件中:5:0: globals.h:8: 25:警告:'A'初始化並聲明爲'extern' globals.cpp:9:18:錯誤:重新定義'閃電::陣列 A' globals.h:8:25:error:'blitz :: Array A'先前在這裏聲明 – lovespeed

+1

@SthitadhiRoy我認爲你需要擺脫globals.h中的構造函數調用(只需將其保留爲'extern Array A;')。 – Lalaland