C全局变量中的C交叉关注问题

时间:2017-06-21 20:42:54

标签: c global-variables software-design

在我的软件设计中,我有两个横切问题。内存分配器跟踪其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");

}

3 个答案:

答案 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