C語言結構體宣告的妙用,隱藏結構體內部資訊
阿新 • • 發佈:2019-02-04
測試環境: vs2008
1. 前言
C語言是一個比較底層的語言,似乎沒有c++,java高階語言中對成員變數的保護,例如加上private修飾。但其實C語言也可以通過結構體的宣告達到型別的效果。
具體的做法是在一個頭檔案裡定義一個結構,另外一個C檔案實現,操作這個結構的函式。其中,定義結構的標頭檔案只能被實現其操作的C檔案include。當第三方的程式想操作這個結構的時候,只能include一個“公共的標頭檔案”,這個公共的標頭檔案裡面包含那個結構體的宣告,和對其操作的函式的宣告。
2.一個實現的小例子
person_private.h
// person_private.h #ifndef __PERSON_PRIVATE__ #define __PERSON_PRIVATE__ struct person { char name[128]; int age; char job[128]; }; #endif
上述程式碼定義了一個私有的標頭檔案,裡面定義了結構person。
person.c
person.c實現了對這個結構struct person分配記憶體,釋放記憶體,和獲取物件資訊的函式。其中person_private.h只被person.c包含。// person.c #include <stdio.h> #include <malloc.h> #include <string.h> #include "person_private.h" struct person* person_new(const char *name, int age, const char *job) { if (!name || !job) return NULL; struct person *_this = (struct person *)calloc(1, sizeof(struct person)); if (!_this) return NULL; memcpy(_this->name, name, strlen(name)); _this->age = age; memcpy(_this->job, job, strlen(job)); return _this; } void person_free(struct person **person) { if (!person || !(*person)) return; free(*person); *person = NULL; } void getPersonInfo(struct person *person) { if (!person) { printf("Error: param null pointer\n"); return; } printf("name: %s, age = %d, job = %s\n", person->name, person->age, person->job); }
person.h
person.h這個標頭檔案是一個“公共標頭檔案”,被其他的應用程式include。裡面聲明瞭結構體struct person和公共函式。// person.h #ifndef __PERSON_H__ #define __PERSON_H__ struct person; struct person* person_new(const char *name, int age, const char *job); void person_free(struct person **person); void getPersonInfo(struct person *person); #endif
main.c
// main.c
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include "person.h"
int main()
{
struct person *per = person_new("zhangsan", 20, "student");
if (!per) return -1;
getPersonInfo(per);
person_free(&per);
printf("After free, per = %p\n", per);
return 0;
}
main.c實現了對結構struct person的應用。注意的是,在main.c中不能夠直接定義一個struct person物件,只能定義struct person指標,是因為編譯器不知道struct person真實佔用的記憶體大小。仔細看main.c包含的是person.h,person.h裡面只有結構體的宣告。3. 編譯執行
name: zhangsan, age = 20, job = student
After free, per = 00000000
請按任意鍵繼續. . .