C 全局变量中的 C 横切关注点

C cross cutting concern in C global variable

我在设计软件时有两个横切关注点。内存分配器在其 struct(class) 成员变量中跟踪内存使用情况。我也有一个记录器。现在我将记录器和分配器传递到我的对象的构造函数中。我可以保留对它们的引用,但我必须在我创建的每个结构(class)中都这样做。如果它们是全局的就好了,但我不确定如何在 C 中做到这一点。我可以构建一个全局内存分配器来正确跟踪使用的字节而不将其传递给我的函数调用以进行引用吗?

编辑: 我试图在我的创建和销毁函数中使用 object_tracker 作为全局变量。当我编译和测试下面的文件时,这是我得到的结果:How do I use extern correctly to get the global reference to work?

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");

}

是的,你可以在 C 中做到这一点,只需在文件顶部定义全局内存分配器,它下面的所有内容都会知道它的存在。

为了让其他文件关注它,请使用 extern,如 How do I share a global variable between c files?

中所述

请记住,应尽可能避免使用全局变量。

我删除了 extern 关键字并创建了一个包含 object_tracker 声明的 globals.h 文件。我将它包含在每个 "class" 文件中并且它有效。我仍然不确定 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("heello\n");

}