2017-06-21 46 views
1

我的软件设计中存在两个横切问题。内存分配器跟踪其结构(类)成员变量中的内存使用情况。我也有一个记录器。现在我将记录器和分配器传递给我的对象的构造函数。我可以保留对它们的引用,但是我必须在每个创建的结构(类)中都这样做。这将是很好,如果他们是全球性的,但我不知道如何在C中做到这一点。我可以构造一个全局内存分配器,将正确跟踪所使用的字节,而不传递给我的函数调用引用?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("heello\n"); 

} 
+1

是的,你可以将它分配给一个全局变量。 –

+0

@oliver所以在我的主程序中,我可以分配全局结构。然后,我甚至可以在其他源文件中引用它? –

+0

你为什么不试试看? – csmckelvey

回答

0

我删除了extern关键字,并用object_tracker的声明创建了一个globals.h文件。我将它包含在每个“类”文件中,并且工作正常。我仍然不确定使用了extern关键字。

0

是的,你可以这样做,在C,只要定义全局内存文件顶部的分配器以及所有内容下面会知道它的存在。

为了其他文件有它的眼睛,用extern,如How do I share a global variable between c files?

解释但请记住全局变量,应避免在可能的情况。

+0

单独文件怎么样?单独的文件如何知道它的存在? –

+0

@eat_a_lemon查看我更新的答案。 – gsamaras

+0

请参阅我的编辑请 –

0

根据你的例子,没有定义全局变量'object_tracker'。你已经定义了这样的变量,但是它在主函数中。

struct Object_Tracker* object_tracker = Object_Tracker_Create();//Inside main function ??? 

由于它在主函数内部定义,所以对其他函数不可见。 因此,将此定义移至全局范围。更新后的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"); 

} 
+0

object_tracker是在test_file.h中全局定义的,但是extern关键字导致了一个问题,所以我删除了它并且一切正常。 –

+0

代码行'[code] extern struct Object_Tracker * object_tracker;'没有定义变量。它说编译器在某处定义了变量'object_tracker',所以继续编译。由于没有这种可变链接器失败。但是当你删除'extern'这行更改为变量定义。所以如你所说,这个问题消失了。 – Pra

+0

请参考[链接](http://www.cprogramming.com/declare_vs_define.html)在声明和定义方面有很好的例子。 – Pra