2017-06-21 15 views
1

ソフトウェアの設計に2つのクロスカッティングの問題があります。メモリアロケータは、struct(クラス)メンバ変数のメモリ使用量を追跡します。私にはロガーもあります。今は、ロガーとアロケータをオブジェクトのコンストラクタに渡しています。私はそれらへの参照を維持することができますが、私はそれを私が作成するすべての構造体(クラス)で行う必要があります。もしそれらがグローバルであればうれしいですが、私はCでそれを行う方法がわかりません。参照用の関数呼び出しに渡さずに使用されるバイトを正確に追跡するグローバルメモリアロケータを構築できますか?Cグローバル変数のCのクロスカッティングの問題

EDIT: 私は作成と破棄の関数でグローバル変数としてobject_trackerを使用しようとしています。以下のファイルをコンパイルしてテストすると、結果が得られます。externを正しく使用して、グローバル参照を機能させるにはどうすればいいですか?

gcc -I ../include object_tracker.c test_file.c test_main.c -o test 
./test 

/tmp/ccuT8Z1A.o: In function `Test_Create': 
test_file.c:(.text+0xb): undefined reference to `object_tracker' 
/tmp/ccuT8Z1A.o: In function `Test_Destroy': 
test_file.c:(.text+0x4b): undefined reference to `object_tracker' 
collect2: error: ld returned 1 exit status 

test_file.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "object_tracker.h" 
#include "test_file.h" 

struct Test* Test_Create() { 
     struct Test* test = (struct Test*)Object_Tracker_Obj_Alloc(object_tracker, 1, sizeof(struct Test)); 
     test->foobar = 10; 
     return test; 
} 

void Test_Destroy(struct Test* test) { 
     if(test != NULL) { 
       Object_Tracker_Obj_Free(object_tracker, test); 
     } 
} 

test_file.h

#ifndef _TEST_FILE_H_ 
#define _TEST_FILE_H_ 

#include "object_tracker.h" 

extern struct Object_Tracker* object_tracker; 

struct Test { 
     int foobar; 
}; 

struct Test* Test_Create(); 
void Test_Destroy(struct Test* test); 

#endif 

test_main.c

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include "object_tracker.h" 
#include "test_file.h" 

int main(int argc, char* argv[]) { 

     struct Object_Tracker* object_tracker = Object_Tracker_Create(); 
     struct Test* test = Test_Create(); 
     Test_Destroy(test); 
     printf("heello\n"); 

} 
+1

はい、グローバル変数に割り当てることができます。 –

+0

@oliverだから私のメインプログラムでは、グローバル構造体を割り当てることができました。そして、私は他のソースファイルでも参照することができますか? –

+0

あなたはそれを試してみてみませんか? – csmckelvey

答えて

0

私はexternキーワードを削除し、object_trackerの宣言でglobals.hファイルを作成しました。私はすべての "クラス"ファイルを含め、それは動作します。私はexternキーワードが何のために使われているかまだ分かりません。

0

はい、あなたはCで、ちょうどグローバルメモリを定義することを行うことができますファイルの先頭にあるアロケータ、およびすべてその存在を知ることになる。可能な場合、グローバル変数は避けるべきであるものの、他のファイルがそれに目を持っているようにするためには

How do I share a global variable between c files?

で説明したように、externを使用するには、覚えておいてください。

+0

別々のファイルはどうですか?別々のファイルは、その存在をどのように知っていますか? –

+0

@eat_a_lemon私の更新された回答を参照してください。 – gsamaras

+0

私の編集を参照してください –

0

あなたの例によると、変数 'object_tracker'はグローバルに定義されていません。あなたはそのような変数を定義していますが、それは主な機能の中にあります。

struct Object_Tracker* object_tracker = Object_Tracker_Create();//Inside main function ??? 

メイン関数の内部で定義されているため、他の関数からは見えません。 この定義をグローバルスコープに移動します。更新されたtest_main.cは以下の通りです。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include "object_tracker.h" 
#include "test_file.h" 

struct Object_Tracker* object_tracker; //Global scope variable 

int main(int argc, char* argv[]) { 

     object_tracker = Object_Tracker_Create(); //Assign value for the variable 
     struct Test* test = Test_Create(); 
     Test_Destroy(test); 
     printf("heello\n"); 

} 
+0

object_trackerはtest_file.hでグローバルに定義されていますが、externキーワードは問題を引き起こしました。 –

+0

コード行 '[code] extern struct Object_Tracker * object_tracker;'変数が定義されていません。コンパイラには、変数 'object_tracker'がどこかに定義されているので、コンパイルに進むと言います。そのような可変リンカーは失敗しないので。しかし、 'extern'を削除すると、その行は変数の定義に変更されます。だから、問題が消えたとあなたが言いました。 – Pra

+0

[link](http://www.cprogramming.com/declare_vs_define.html)には、宣言と定義の良い例がありますので参考にしてください。 – Pra

関連する問題