ソフトウェアの設計に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");
}
はい、グローバル変数に割り当てることができます。 –
@oliverだから私のメインプログラムでは、グローバル構造体を割り当てることができました。そして、私は他のソースファイルでも参照することができますか? –
あなたはそれを試してみてみませんか? – csmckelvey