[C/C++]不透明結構體使用

首先A代碼:函數

struct.h(A的結構體定義)
測試

#ifndef __STRUCT_H__
#define __STRUCT_H__

typedef struct _MyStruct
{
	int iAge;
	char* pName;
}ST_MY_STRUCT,*PST_MY_STRUCT;

#endif

Method.h(A提供給B的頭文件)spa

#ifndef __METHOD_H__
#define __METHOD_H__

typedef struct _MyStruct _MyStruct_t; //這裏注意一下,下文中會解釋這句話

void vPrintf(_MyStruct_t* pstMyStruct); //供B調用,輸出結構體信息

_MyStruct_t* stCreateStruct(int iAge, const char* pName); //供B調用,生成結構體

#endif

Method.cpp(A函數實現)指針

#include "Method.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "struct.h"

void vPrintf(_MyStruct_t* pstMyStruct)
{
	if (!pstMyStruct)
	{
		printf("the struct is null\n");
		return;
	}
	printf("Age:%d----Name:%s\n", pstMyStruct->iAge, pstMyStruct->pName);
}

_MyStruct_t* stCreateStruct(int iAge, const char* pName)
{
	_MyStruct_t* pstMyStruct = (_MyStruct_t*)malloc(sizeof(_MyStruct_t));
	memset(pstMyStruct, 0, sizeof(_MyStruct_t));
	pstMyStruct->iAge = iAge;
	int iSize = strlen(pName) + 1;
	pstMyStruct->pName = (char*)malloc(iSize);
	memcpy(pstMyStruct->pName, pName, iSize);
	return pstMyStruct;
}

A將代碼編譯以後生成Lib文件(LibTest.lib),將Method.h和LibTest.lib兩個文件提供給B。code

-------------------------------------------以上爲A代碼,如下爲B代碼-------------------------------------------orm

B將A提供的頭文件和lib文件加入工程。
string

B調用Lib的代碼:
it

#include "Method.h"

int main(int argc, char* agrv[])
{
	_MyStruct_t* pstMyStruct = stCreateStruct(10, "china");
	vPrintf(pstMyStruct);
	free(pstMyStruct);
	return 0;
}


------------------------------------------我是華麗的分割線------------------------------------------------------io

       typedef struct _MyStruct _MyStruct_t 這句代碼爲B提供了使用結構體的定義,可是B只能使用結構體指針,而不能直接使用結構體,且沒法接觸到結構體中的成員,從而實現告終構體的不透明化。根據我的理解,這裏用到的應該只是一個指針,不管什麼指針均可以,即便定義成 typedef int _MyStruct_t,依然可以編譯運行(VS下測試經過)。編譯

相關文章
相關標籤/搜索