2017-06-21 14 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