1. 程式人生 > >C語言結構體宣告的妙用,隱藏結構體內部資訊

C語言結構體宣告的妙用,隱藏結構體內部資訊

測試環境: 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

#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.c實現了對這個結構struct person分配記憶體,釋放記憶體,和獲取物件資訊的函式。其中person_private.h只被person.c包含。

person.h

// 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
person.h這個標頭檔案是一個“公共標頭檔案”,被其他的應用程式include。裡面聲明瞭結構體struct person和公共函式。

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
請按任意鍵繼續. . .