2016-11-15 6 views
3

"複数の定義" エラーの回避策を必要とします.h:は、次のように私の問題を説明するためのおもちゃのコードがある

#include "stuff.h" 
#include <stdio.h> 

fcn.c:

#include "main.h" 

void fcn() { 
    printf("Hello\n"); 
} 

はmain.cの:

#include "main.h" 
#include "fcn.h" 

int main() { 
    fcn(); 
    printf("HI\n"); 
} 

コンパイルしようとする試みがで失敗します。

/g/pe_19976/fcn_2.o:(.data+0x40): multiple definition of `testarr' 
/g/pe_19976/main_1.o:(.data+0x40): first defined here 

は、いくつかの読書を行った後、私は、ヘッダファイルに配列testarrを定義することであることを認識します問題。しかし、実際のコードでは、いくつかのファイルがtestarrにアクセスする必要があり、どこにでも同じ割り当て値を持つ必要があります。私はそれをmain.h(?)に入れることができると思いますが、それが機能するとしても、実際のコードでは論理的にはstuff.hに属しています。どのように私はこの謎を解決するのですか?

私が見つけたことに基づいて、testarrexternと定義しようとしましたが、同じ問題がありました。

答えて

0

なぜ非常に多くのグローバル変数を使用しているのかは不明です。対応するヘッダーを含むコンパイル単位は、(あなたの例では少なくとも二つのコンパイル単位がある)が存在するように配列

int testarr[]={1,2,3}; 

は何度として定義されます。

extern int testarr[3]; 

ようなヘッダの配列を宣言し、CPPモジュールで定義します。

int testarr[]={1,2,3}; 

外部リンケージを持つ他のグローバル変数でも同じことが言えます。

この発言については

ところで、私が見つけた何か他のものに基づいて、私は externとtestarr定義しようとしたが、同じ問題を抱えて。

次に、指定子externを持つ配列は、ヘッダで初期化されていてはなりません。それ以外の場合は、配列の定義です。

3

可変定義をヘッダーファイルに入れると、それを含む.cファイルにはその変数のコピーが含まれます。それらをリンクしようとすると、多重定義エラーが発生します。

ヘッダーファイルには、変数の宣言のみを含める必要があります。これは、externキーワードを使用し、初期化子を使用しないで行います。

正確に1つの.cファイルでは、省略可能なイニシャライザとともに定義を置きます。

のmain.c:

#include "main.h" 
#include "fcn.h" 

int a; 
int testarr[]={1,2,3}; 

int main() { 
    fcn(); 
    printf("HI\n"); 
} 

stuff.h:

#ifndef STUFF 
#define STUFF 

extern int a; 
extern int testarr[]; 

#endif 

fcn.h:

#include "stuff.h" 
extern int b[]; 
void fcn(); 

fcn.c:

例えば

#include "main.h" 

int b[]={5,6,7}; 

void fcn() { 
    printf("Hello\n"); 
} 
関連する問題