在我的软件设计中,我有两个横切问题。内存分配器跟踪其struct(类)成员变量中的内存使用情况。我也有一个记录器。现在我将记录器和分配器传递给我的对象的构造函数。我可以保持对它们的引用,但是我必须在我创建的每个结构(类)中都这样做。如果它们是全局的会很好但是我不知道如何在C中做到这一点。我可以构造一个全局内存分配器,它将正确地跟踪所使用的字节而不将其传递给我的函数调用引用吗?
编辑: 我试图在我的create和destroy函数中使用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");
}
答案 0 :(得分:0)
是的,您可以在C中执行此操作,只需在文件顶部定义全局内存分配器,下面的所有内容都将知道它的存在。
为了让其他文件能够关注它,请使用extern
,如How do I share a global variable between c files?中所述
请记住,尽管应尽可能避免使用全局变量。
答案 1 :(得分:0)
我删除了extern关键字并使用object_tracker的声明创建了一个globals.h文件。我把它包含在每个“类”文件中并且它有效。我仍然不确定extern关键字的用途。
答案 2 :(得分:0)
根据您的示例,全局没有定义变量'object_tracker'。您已定义此类变量,但它位于main函数内部。
[].forEach.call
由于它在main函数中定义,因此对其他函数不可见。 因此,将此定义移至全局范围。更新后的test_main.c如下所示。
.classList.toggle