我的软件设计有两个横切问题。内存分配器在其结构(类(成员变量中跟踪内存使用情况。我还有一个记录器。现在我正在将记录器和分配器传递到对象的构造函数中。我可以维护对它们的引用,但是我必须在我创建的每个结构(类(中执行此操作。如果它们是全局的,那就太好了,但我不确定如何在 C 中做到这一点。我是否可以构造一个全局内存分配器,该分配器将正确跟踪使用的字节,而无需将其传递给我的函数调用以引用?
编辑:我正在尝试在创建和销毁函数中使用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("heellon");
}
是的,你可以在 C 中做到这一点,只需在文件顶部定义全局内存分配器,它下面的所有内容都会知道它的存在。
为了让其他文件关注它,请使用 extern
,如如何在 c 文件之间共享全局变量中所述?
但请记住,应尽可能避免使用全局变量。
我删除了extern关键字,并创建了一个globals.h文件,其中包含object_tracker的声明。我在每个"类"文件中都包含它,它可以工作。 我仍然不确定 extern 关键字的用途。
根据您的示例,全局没有定义变量"object_tracker"。您已经定义了这样的变量,但它在 main 函数中。
struct Object_Tracker* object_tracker = Object_Tracker_Create();//Inside main function ???
由于它是在 main 函数中定义的,因此对其他函数不可见。因此,将此定义移至全局范围。更新后的 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("heellon");
}